1.
There is a ton of code out there which does something like
def contains(that: Thing): Boolean =
this.value identity that || this.value equality that
Pretty much every single collection implementation would be broken if this stopped working with value types.
Additionally, you would run into issues with floating point numbers which would not be found/retrieved anymore if identity were removed.2.
The idea to define a _sane_ definition of identity/equality across all types is there to avoid the "next-best" option: boxing primitives to wrapper classes which is both slow and has terrible semantics.
3.
I don't really think restricting identity to e.g. reference types makes sense given that equality is defined for every type. Either none of them should be available by default, or both should be.
There _are_ multiple valid ways to compare to things (consider floating point numbers for a second) and making one more privileged than the other feels wrong.