lack of stacking is the problem
if you cannot put a unit and a boat on the same tile there is nothing you can do to defend it, especially when all the naval units behave like archers
I'm not sure about this. I mean technically they're still military units, with all that it entails. And as someone mentioned, requiring stacking makes things more difficult for the AI - and I'd add that it seems a little inelegant to me as well. One particular problem is if you're using marines to attack a city, but the marine is defended from land bombardment by a stacked ship on top of it, that's a pretty cheap exploit right there.
Really, I think overrunning itself is more the problem. Require ships to bombard embarked units instead of just overrunning, and I think you get quite a nice balance of risk for naval operations. If you actually try bombarding embarked units in the current game, it takes on average 2-3 bombardments to sink an embarked unit, which I think is okay (if a tiny bit much). Attacking an embarked unit would require a ship to use up its attack for the turn as well, so it can't then also trade blows with the enemy navy. A screening naval force/carrier air group can be very useful to tear apart any naval/air forces that come near, but embarked units are still uncovered and potentially exposed to risk.
It also means that the tight, annoying co-ordination of one naval unit per embarked unit having to constantly move together isn't needed (and I could see that getting really old really fast - orders of magnitude more annoying than naval movement currently is) - rather it favours more a screening picket of warships, but with less of the current extreme risk if the picket isn't perfect.
I've tried this myself (accidentally actually, by just not even knowing that overrunning was an option
), and it works really nicely, I think. A simpler solution, too.