Value Objects are objects that can be shared across different parts of a program. This can have great benefits in performance. Because the objects are shared it is very important for value objects to be immutable. If value objects are not immutable then any part of the program can change the values and all the other parts can do calculation with erroneous data.
One of my goals was to make immutable objects in F# to take advantage of parallelization and automatic compiler optimizations:
type City(Name:string, X: float, Y:float) = member t.Name = Name member t.X = X member t.Y = Y type NeighborCities(city1:string, city2:string) = member x.fromCity = city1 member x.toCity = city2
Objects created in this manner in F# are immutable. Even when they are accessed in other projects outside their definition, their members are read-only. This was specially helpful on the distributed traveling salesman problem I built last year.