This is also a conscious choice - it is better to avoid coercion at runtime when possible. Coercion invariably means type checking and boxing, and if we can build execution plans that avoid that, we can make more performant code.

If you look at ast.Expression#toPredicate, you see that it's still possible to treat any expression as a predicate. This simply avoids coercion when we know we don't need it.