Eric Lippert points out three things that I think apply in his article future proofing a designfuture proofing a design. I think if you follow it you will be in good shape.
First: Premature generality is expensive.
Second: Represent in your model only those things which are always in the problem domain and whose class relationships are unchanging.
Third: Keep your policies away from your mechanisms.