Change:
JSON types are not used much in the JSON spec. It is debatable whether there really is a boolean type or simply the values and . Also, the JSONPath spec doesn't really benefit from this term.
I think this reads well without breaking any semantics.

Discussion:
in ABNF as "%x2318". The terminology of RFC8259 applies except where clarified below.  The <del> terms "Primitive" and "Structured" are used to group the types as in RFC8259; JSON Objects and Arrays are structured, all other types are primitive.  Definitions for "Object", "Array", "Number", and "String" remain unchanged.  Importantly "object" and "array" in particular do not take on a generic meaning, such as they would in a general programming context. </del> <ins> terms "Primitive" and "Structured" are used to group different kinds of values as in RFC8259; JSON Objects and Arrays are structured, all other values are primitive.  Definitions for "Object", "Array", "Number", and "String" remain unchanged.  Importantly "object" and "array" in particular do not take on a generic meaning, such as they would in a general programming context. </ins> Additional terms used in this specification are defined below.

Firstly, "$" produces a nodelist consisting of just the argument. <del> Next, ".a" selects from any input node of type object and selects the node of any member value of the input node corresponding to the member name ""a"".  The result is again a list of one node: </del> <ins> Next, ".a" selects from any object input node and selects the node of any member value of the input node corresponding to the member name ""a"".  The result is again a list of one node: </ins> "[{"b":0},{"b":1},{"c":2}]". <del> Next, "[*]" selects from an input node of type array all its elements (if the input node were of type object, it would select all its member values, but not the member names).  The result is a list of three nodes: "{"b":0}", "{"b":1}", and "{"c":2}". </del> <ins> Next, "[*]" selects from any array input node all its elements (for an object input node, it would select all its member values, but not the member names).  The result is a list of three nodes: "{"b":0}", "{"b":1}", and "{"c":2}". </ins> <del> Finally, ".b" selects from any input node of type object with a member name "b" and selects the node of the member value of the input node corresponding to that name.  The result is a list containing "0", "1".  This is the concatenation of three lists, two of length one containing "0", "1", respectively, and one of length zero. </del> <ins> Finally, ".b" selects from any object input node with a member name "b" and selects the node of the member value of the input node corresponding to that name.  The result is a list containing "0", "1".  This is the concatenation of three lists, two of length one containing "0", "1", respectively, and one of length zero. </ins> As a consequence of this approach, if any of the segments produces an empty nodelist, then the whole query produces an empty nodelist.

orderings in successive runs of the query. In what follows, the semantics of each segment are defined for each <del> type of input node. </del> <ins> kind of input node. </ins> 3.4.

or of their array elements or member values, respectively.  Applied to <del> other value types, it will select nothing. </del> <ins> primitive values, it will select nothing. </ins> The order in which the children of an object appear in the resultant nodelist is not stipulated, since JSON objects are unordered.

a comparison using the operator "==" yields true if and only if the comparison is between: <del> values of the same primitive type (numbers, strings, booleans, and "null") which are equal, </del> <ins> equal primitive values, </ins> equal arrays, that is arrays of the same length where each element of the first array is equal to the corresponding

by the objects are equal. a comparison using the operator "<" yields true if and only if the <del> comparison is between values of the same type which are both numbers or both strings and which satisfy the comparison: </del> <ins> comparison is between values which are both numbers or both strings and which satisfy the comparison: </ins> numbers expected to interoperate as per RFC7493 MUST compare using the normal mathematical ordering; numbers not expected to