C'est un peu confus, à force de vouloir tout faire entrer dans le modèle objet ça déborde à quelques endroits

Le type
object est le parent de tous les autres types, et le parent des types valeur est
ValueType qui bien sûr hérite lui-même de
object. Du coup tu peux écrire des choses comme
object i = 3; qui fonctionne parce que
int hérite de
object, sauf que ça boxe. Et puis tu te retrouves avec une variable
i qui vaut bien 3, mais dans laquelle tu pourrais aussi mettre
null juste derrière sans que ça pose problème, alors qu'un
int (qui hérite lui aussi de
object) ne peut jamais être nul.