Value objects are immutable objects that model concepts from the problem domain. They have value semantics rather than reference semantics. Value objects are immutable, which means their internal state can never be modified. This intrinsic immutability makes value objects inherently thread-safe and easy to reason about, as their behavior remains consistent. Languages with object-oriented features need to resist the temptation to mutate value objects and instead produce new instances when operating on them.