Какие отличие между значимыми и ссылочными типами? Зачем придумали такое разделение? Нельзя было придумать только либо значимые либо ссылочные?
Все хранить в стеке невозможно для обычных программ.
Все хранить в куче реально (достаточно упаковывать все valued-переменные), но очень и очень не оптимально. Работа со стеком гораздо быстрее, для работы с ним есть  специализированные регистры процессора, а для того чтобы обратится к участку произвольной памяти компьютера даже на низком уровне надо сделать много операций. И очищается стек моментально, никаких сборщиков мусора не нужно.
ответ кроется в самой сущности. Сохранить переменную byte, int, double word или адресс - для этого понадобиться всего-то навсего байт, два байта, ну или столько, сколько на сегодня актуально - например 8 байтов (64 Bit). 
Это всегда более менее легко организовать. Например тот-же int array с его элементами. Они все чинно лежат друг за другом. Если идёт разговор о сложных структурах, начиная со string, то там уже проще сохранять и организовывать адресса для тех мест, где на самом деле лежат эти структуры. 

И всё - нет никакого злого умысла или тупости. Всё сделано для простоты организации всех этих вещей и легкости справлятся с такими задачами, как создавание переменных/обьектов, их видоизменения и удаления.

Так-же как и с Carbadge Collection. Тратить время на "точное" удаление обьектов из памяти во время работы программы  - свою программу не уважать. Но здесь распределение действий, а в вашем вопросе распределение мест.