Typically, a value object encapsulates a value that matters: currency, dates, temperature, etc. They may contain meaning and units, but they are not complex.
A domain object is likely to be more complex (unless it is an anonymous domain object, which is a bunch of getters and setters claiming to be a domain object), because it contains domain logic.
For example, you might have an invoice domain object that contains many invoice lines (a line for each invoice element), and each invoice line may have a net amount, tax amount, and an invoice element. The amount and, possibly, the invoice are usually Value objects and can be quite simple.
The Account itself may be complicated by interest rates for late payments, supporting the approval process, or supporting your accounting system.
The Value object is simple enough to be reusable across domains. Domain objects simulate your actual domain and are usually written to simulate your particular business or domain, including your business logic.
The reason you often find a small difference between the two is because many developers will use the Transaction Script / Data Transfer Object project, but call it a domain model. They label their collections of getters and setters with "domain items."
source share