First, this is broken in the presence of raw pointers too.
Second, I'm not really convinced by your argument (I can't explain why, but I don't feel good about that).
Third, it is not even decided yet whether you're allowed to access only the copied from object (and it is not invalidated), not to mention both it and the new object (What about: use-after-move and (maybe) use-after-drop · Issue #188 · rust-lang/unsafe-code-guidelines · GitHub), and you should avoid doing that in the meantime:
Fourth, I think the solution is to (eventually) stabilize auto traits, not create an auto trait in std for each use.
Fifth, this trait already exists (compiler-internal): Freeze
.