Często przydatne jest kategoryzowanie obiektów jako enkapsulujące wartości lub byty, z tym wyjątkiem, że jeśli coś jest wartością, kod, który zawiera odniesienie do niego, nigdy nie powinien widzieć zmiany stanu w żaden sposób, którego sam kod nie zainicjował. Natomiast kod, który zawiera odniesienie do jednostki, może oczekiwać, że zmieni się w sposób niezależny od posiadacza referencji.
Chociaż możliwe jest użycie enkapsulacji wartości przy użyciu obiektów zmiennych lub niezmiennych, obiekt może zachowywać się jak wartość tylko wtedy, gdy spełniony jest co najmniej jeden z następujących warunków:
Żadne odniesienie do obiektu nigdy nie będzie narażone na cokolwiek, co mogłoby zmienić stan w nim zawarty.
Posiadacz co najmniej jednego z odniesień do obiektu zna wszystkie zastosowania, do których mogłoby dojść jakiekolwiek istniejące odniesienie.
Ponieważ wszystkie wystąpienia typów niezmiennych automatycznie spełniają pierwsze wymaganie, używanie ich jako wartości jest łatwe. Z drugiej strony, zapewnienie, że którykolwiek z wymogów jest spełniony podczas korzystania ze zmiennych typów, jest znacznie trudniejsze. Podczas gdy odniesienia do typów niezmiennych można swobodnie przekazywać jako sposób enkapsulacji stanu w nich zawartego, przekazywanie stanu przechowywanego w typach zmiennych wymaga albo zbudowania niezmiennych obiektów owijających, albo skopiowania stanu enkapsulowanego przez obiekty prywatne do innych obiektów, które są dostarczone lub skonstruowane dla odbiorcy danych.
Niezmienne typy działają bardzo dobrze do przekazywania wartości i często są przynajmniej w pewnym stopniu przydatne do manipulowania nimi. Nie są jednak tak dobrzy w obsłudze podmiotów. Najbliższą rzeczą, jaką można mieć do bytu w systemie z typami czysto niezmiennymi, jest funkcja, która, biorąc pod uwagę stan systemu, zgłosi te atrybuty jego części lub wytworzy nową instancję stanu systemu, która jest jak pod warunkiem, z wyjątkiem niektórych jego szczególnych części, które będą się różnić w pewien wybierany sposób. Ponadto, jeśli celem bytu jest połączenie jakiegoś kodu z czymś, co istnieje w świecie rzeczywistym, może być niemożliwe uniknięcie ujawnienia stanu zmienności.
Na przykład, jeśli ktoś odbierze jakieś dane przez połączenie TCP, może wytworzyć nowy obiekt „stan świata”, który zawiera te dane w swoim buforze bez wpływu na jakiekolwiek odniesienia do starego „stanu świata”, ale stare kopie stan świata, który nie obejmuje ostatniej partii danych, będzie wadliwy i nie powinien być używany, ponieważ nie będą już pasować do stanu gniazda TCP w świecie rzeczywistym.