Moves from `self` during the drop hook

I'm not sure I understand what you're asking. I'm certainly not saying that all drop implementations should be guaranteed not to move memory around, only that it should be possible to implement drop for a type that can't be moved. One would obviously be very limited as to when and how one could use such a type. That's why I'm suggesting that everything would have a Move bound by default, similarly to how Sized works. A generic struct or function that wanted to use ptr::read obviously wouldn't specify : ?Move.