Melt the butter in a large pot or dutch oven over medium heat. When the butter is melted and foamy add the onions and celery. Cook for 3 minutes until the onions are translucent. Stir frequently.
Add the garlic, salt, and black pepper. Cook for 1 minute, stir often.
Add the flour and cook for 1-1½ minutes to cook out the raw flour taste. Stir almost constantly.
Next, add the broth while stirring briskly with a wooden spoon or whisk. Continue adding and stirring until the flour is dissolved.
Add the creamed corn and ham. Stir well. Raise the heat and bring the soup to a simmer (will take about 5 minutes). Lower the heat to medium-low, cover, and cook for 10 minutes. Stir occasionally to make sure nothing is sticking to the bottom. Keep the liquid at a simmer. Raise or lower the heat, as needed.
In the meantime, cook the corn enough to defrost. Usually, half the recommended time on the package will be enough. Drain well.
Add the potatoes and corn kernels to the soup. Raise the heat, when it starts to simmer, lower the heat to medium-low, cover, and cook for 15-20 minutes or until the potatoes are tender. Stir occasionally to make sure they are not sticking to the bottom of the pot.
Finally, lower the heat to low, add the half and half (or milk), stir well, cover and cook gently for 2-3 minutes to heat through.
Taste and add salt if needed. As a reference we added ¾ teaspoon to ours. Serve the soup into individual bowls, garnish with green onions or chives, if desired.