На стеке ничто не занимает меньше 4 байт, потому что в байт-коде есть только инструкции для операций с int, long, float, double и объектными ссылками на стеке:
https://en.wikipedia.org/wiki/Java_bytecode_instru...
В памяти объектов все типы занимают "нужное" кол-во байт (за исключением boolean, который мог бы занимать всего один бит, а занимает целый байт, см. java.util.BitSet), но из-за выравнивания объектов (размеры объектов выравниваются по-умолчанию (и как минимум) на границу 8 байт в Hotspot JVM) зачастую получается так, что одно поле byte или boolean увеличивает размер объекта сразу на 4-8 байт. (Но добавление следующих 3-7 полей будут как бы "бесплатно").