> I don't see a need here for a watertight solution that means you can never by any means create an 'invalid' version object.

Why? Data should always be hidden within the class and I can't think why you might want this to be an exception to the rule.  At the very least, making them 'hidden attributes' might be enough if you want to minimise the change?