Fue una decisión de diseño de Java, y una que algunos consideran un error. Los contenedores quieren objetos y las primitivas no derivan de objetos.
Este es un lugar que los diseñadores de .NET aprendieron de la JVM e implementaron tipos de valores y genéricos, de modo que el boxeo se elimina en muchos casos. En CLR, los contenedores genéricos pueden almacenar tipos de valores como parte de la estructura del contenedor subyacente.
Java optó por agregar soporte genérico al 100% en el compilador sin soporte de la JVM. Siendo JVM lo que es, no es compatible con un objeto "no objeto". Los genéricos de Java le permiten pretender que no hay envoltorio, pero aún así paga el precio de rendimiento del boxeo. Esto es IMPORTANTE para ciertas clases de programas.
El boxeo es un compromiso técnico, y creo que se trata de detalles de implementación que se filtran al lenguaje. El autoboxing es un buen azúcar sintáctico, pero sigue siendo una penalización de rendimiento. En todo caso, me gustaría que el compilador me avise cuando se autoboxes. (Por lo que sé, puede que ahora, escribí esta respuesta en 2010).
Una buena explicación sobre SO sobre el boxeo: ¿Por qué algunos idiomas necesitan Boxing y Unboxing?
Y críticas a los genéricos de Java: ¿por qué algunos afirman que la implementación de genéricos de Java es mala?
En defensa de Java, es fácil mirar hacia atrás y criticar. La JVM ha resistido la prueba del tiempo y es un buen diseño en muchos aspectos.