I have some custom types. They are all basically enums. Here is an example of what they look like:
CREATE TYPE card_suit AS ENUM
(\'spades\',
\'clubs\
Another approach would have been
st.setObject(1, 'spades', Types.OTHER);
Have you tried to cast column to enum?
// Setup stuff up here.
sql = "INSERT INTO foo (suit) VALUES (?::card_suit)";
st.setString(1, 'spades');
st.executeUpdate(sql);
Explained in Convert between Java enums and PostgreSQL enums article of 'A web coding blog' with samples:
INSERT INTO pet (pet_id, pet_type, name)
VALUES (?, CAST(? AS animal_type), ?);
--or
INSERT INTO pet (pet_id, pet_type, name)
VALUES (?, ?::animal_type, ?);