Can you explain why it is good that null is a valid value for your types at the same time as you are trying to prevent them from ever containing that value?
If the semantics were the same, you wouldn't need a replacement and all your proposed changes would have no observable effect on the behavior of any program.