Melt the butter in a large pot or Dutch oven over medium heat. Once the butter is melted and foamy, add the onions and celery. Cook for 3 minutes, stirring frequently, until the onions are translucent.
Add the garlic, salt, and pepper. Cook for 1 minute, stirring often.
Sprinkle in the flour and cook for 1–1½ minutes to remove the raw flour taste. Stir almost constantly.
Gradually add the broth while stirring briskly with a whisk or wooden spoon. Continue adding and stirring until the flour is fully dissolved.
Stir in the creamed corn.
Raise the heat to bring the soup to a simmer, which will take about 5 minutes. Once simmering, lower the heat to medium-low, cover, and cook for 10 minutes. Stir occasionally, adjusting the heat as necessary to maintain a gentle simmer.
While the soup simmers, cook the frozen corn enough to defrost—usually about half the recommended time on the package. Drain well.
Add the potatoes and defrosted corn to the pot. If the soup doesn’t begin simmering immediately, raise the heat slightly. Then, lower the heat to medium-low, cover, and cook for 15 minutes, or until the potatoes are tender. Stir occasionally to prevent sticking.
Reduce the heat to low. Stir in the half-and-half (or milk), cover, and cook gently for 2–3 minutes, until heated through.
Taste the soup and add salt if needed. As a reference, ½ teaspoon was added to ours.
Ladle the soup into individual bowls and garnish with crispy bacon and chopped chives or green onions, if desired.