A common misunderstanding in my workshops (well, whose fault is it then? ;)), is about the distinction between a DTO and a value object. And so I've been looking for a way to categorize these objects without mistake.
A DTO is an object that holds primitive data (strings, booleans, floats, nulls, arrays of these things).
A value object is an object that wraps one or more values or value objects.
If we are using "DTO" and "value object" in the wrong way, their names will eventually get a different meaning.