I don't agree, perhaps not strongly, but still not. Having the same null for different context is no better than having the same 0 in different contexts.
My point is that it's exactly as good (neither better nor worse): zero is zero, so you should not define a cache API that is supposed to be able to store a zero and assign zero any out of bounds semantics, as is the case with zero_type adding an out of bounds data property you can ostensibly inspect. To see if it's in the cache, add a test method returning a bool. For mappings, the name of this method is has_index.
Substitute "null" for zero above and strike the bit on zero_type, and the same argument holds. Null is null, no more, no less.
Context switching back to the zero_type topic from the unrelated null topic, I think my response to the difficult problem is that 3 is best, 1 acceptable and (after hearing Mast's thoughts) 2 senseless.