I'm definitely using setDate(). I don't know how to check the protocol version, I'm using a simple JDBC URL (the only connection property I'm using is "currentSchema") with a 9.4.4 database and the 9.4.1201 driver with Java 8.
I got the error by running the query in JDBC (not using any framework), and also by calling toString() on the PreparedStatement to understand the error, which is how I noticed that despite calling "setDate", I also had a time component in the results of toString(); I don't know if that's a side effect of toString() or if that's what really gets sent. I'm guessing that it's close -- if not identical -- to what is actually sent because it seems curious otherwise that the database doesn't recognize that my date is a date...