Thanks, Philip. This seems to support my interpretation: if Money *didn't define* behavior when value < 0, then MoneyWithNegativeState would have no contract to violate.
Of course, now that I look at it further, MoneyWithNegativeState, as Tony wrote it, doesn't violate the contract of Money, because Money's contract only says "constructor rejects value < 0" and does nothing to enforce the invariant that value can never be set to 0 by some other method. That makes Money's implementation of the contract ambiguous and incorrect.
By now we're getting into some arcane territory. I don't expect everyone to go there with me. :)