In this case, Java and C# have the same feature and don't have this behavior around null. I think it's reasonable for people who have seen identical features in other languages to expect similar behavior when learning new ones.
But dynamic dispatch on "what type of object do I not have?" is still a damn weird thing to want.
It the types don't match, the operands are not considered equal. Type and value have to match for two interface values to be equal. How does that not make sense?
For mismatched dynamic types you can't meaningfully compare the values in the general case, so of course you need to consider types.
Because people expect == to compare values, not types. Nobody has ever questioned this behavior in Java and C#.