Gather all ingredients.
Rinse beans; transfer to a large stockpot and add water. Bring to a boil and simmer for 2 minutes; remove from heat, cover, and let stand for 1 hour.
Add ham bone, diced ham, onion, salt, pepper, and bay leaf. Bring to a boil; reduce heat to low, cover, and simmer until beans are soft, about 1 hour and 15 minutes.
Add carrots and celery; cook until tender, about 10 to 15 minutes.
Remove ham bone from the pot and place on a cutting board until cool enough to handle. Remove any meat from the bones and cut into bite-sized pieces.
Stir into soup until warmed through. Serve and enjoy!
