Place potatoes into a large pot and cover with salted water; bring to a boil. Reduce heat to medium-low and simmer until tender, 10 to 15 minutes.
Meanwhile, preheat the oven to 350 degrees F (175 degrees C). Grease a 1 ½-quart baking dish.
When the potatoes are almost finished, melt 3 tablespoons butter in a skillet over medium heat. Add ham and onion; cook and stir until the onion has softened and turned translucent, about 5 minutes. Remove from the heat.
Overhead of onions and ham cooking in a skillet.
Dotdash Meredith Food Studios
Drain potatoes; add to the ham mixture and stir to combine. Transfer to the prepared baking dish.
Melt remaining 4 tablespoons butter in a saucepan over medium heat. Whisk in flour and stir until the mixture becomes paste-like and light golden brown, about 5 minutes.
Gradually whisk milk into the flour mixture; season with salt and black pepper. Continue cooking and stirring until thickened, about 2 minutes. Reduce heat to medium-low and stir in Cheddar cheese until melted.
Overhead of shredded cheddar cheese being whisked into a milk and flour mixture cooking in a pot.
Dotdash Meredith Food Studios
Pour cheese sauce over ham and potatoes. Sprinkle bread crumbs over top.
Overhead of cheese mixture being poured over potatoes and ham in a casserole dish.
Dotdash Meredith Food Studios
Overhead of bread crumbs being sprinkled over ham, potatoes, and cheese in a casserole dish.
Dotdash Meredith Food Studios
Bake in the preheated oven until sauce is bubbly and browned, 25 to 30 minutes.