Generously grease a 9x13-inch baking dish with butter or cooking spray. For easy cleanup, consider lining with parchment paper with overhanging edges.
Cut the bread into 1-inch cubes. If using fresh bread, dry it out by spreading cubes on a baking sheet and placing in a 200°F oven for about 10 minutes. Arrange bread cubes evenly in your prepared baking dish.
In a large bowl, whisk together eggs, milk, heavy cream, sugars, vanilla, cinnamon, nutmeg, and salt until completely combined and smooth.
Pour the custard mixture evenly over the bread cubes, making sure all pieces are coated. Gently press down on the bread to help absorption.
In a medium bowl, combine softened butter, brown sugar, flour, cinnamon, and salt until the mixture resembles coarse crumbs. Stir in chopped nuts if using.
Cover the casserole dish tightly with plastic wrap and refrigerate for at least 8 hours or overnight (up to 24 hours).
When ready to bake, remove the casserole from the refrigerator and let it sit at room temperature for about 30 minutes while you preheat your oven to 350°F.
Sprinkle the prepared topping evenly over the soaked bread. Bake uncovered for 45-50 minutes, or until puffed, golden brown, and set in the center. A toothpick inserted in the center should come out clean.
Allow the casserole to cool for 5-10 minutes before serving. Drizzle with maple syrup, dust with powdered sugar, or top with fresh berries before serving.