Foi uma decisão de design Java e que alguns consideram um erro. Contêineres querem Objetos e primitivas não derivam de Objeto.
Este é um lugar que os designers do .NET aprenderam com a JVM e implementaram tipos de valor e genéricos, de modo que o boxe é eliminado em muitos casos. No CLR, contêineres genéricos podem armazenar tipos de valor como parte da estrutura subjacente do contêiner.
Java optou por adicionar suporte genérico 100% no compilador sem suporte da JVM. Sendo a JVM o que é, não suporta um objeto "não-objeto". Os genéricos Java permitem fingir que não há invólucro, mas você ainda paga o preço de desempenho do boxe. Isso é importante para certas classes de programas.
O boxe é um compromisso técnico, e acho que são detalhes de implementação vazando para o idioma. A autoboxing é um bom açúcar sintático, mas ainda é uma penalidade de desempenho. Se alguma coisa, eu gostaria que o compilador me avisasse quando ele caixa automática. (Pelo que sei, agora, escrevi esta resposta em 2010).
Uma boa explicação sobre SO sobre boxe: por que alguns idiomas precisam de boxe e unboxing?
E críticas aos genéricos Java: Por que alguns afirmam que a implementação de genéricos em Java é ruim?
Na defesa de Java, é fácil olhar para trás e criticar. A JVM resistiu ao teste do tempo e é um bom design em muitos aspectos.