It&#x27;s a good question.   Originally, there were two reasons why I didn&#x27;t do this.<p>First, the contract is slightly different, as I am also asserting purity.  This means that one @ImmutableValue knows that another @ImmutableValue (perhaps from a library package) is pure.  Whereas, a class annotated with @Immutable might not be.<p>Second, I developed this with the bank I work in in mind.  They are still on flavours of Java 6 + 7.<p>However, I am currently in mind to port this to Checker Framework, <a href="http:&#x2F;&#x2F;types.cs.washington.edu&#x2F;checker-framework&#x2F;" rel="nofollow">http:&#x2F;&#x2F;types.cs.washington.edu&#x2F;checker-framework&#x2F;</a> which is fully supported by the JDK8 compiler.<p>I expect I&#x27;ll still keep the separate annotation, but there are a lot of benefits from a tooling point of view to doing this (IDE support, gradle etc)