diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 1.6.2
+
+- Added composite encoder
+- Added `oid` and `name` encoders
+
 # 1.6.1
 
 - Added `jsonLazyBytes` and `jsonbLazyBytes`
diff --git a/hasql.cabal b/hasql.cabal
--- a/hasql.cabal
+++ b/hasql.cabal
@@ -1,5 +1,5 @@
 name: hasql
-version: 1.6.1.4
+version: 1.6.2
 category: Hasql, Database, PostgreSQL
 synopsis: An efficient PostgreSQL driver with a flexible mapping API
 description:
diff --git a/library/Hasql/Encoders.hs b/library/Hasql/Encoders.hs
--- a/library/Hasql/Encoders.hs
+++ b/library/Hasql/Encoders.hs
@@ -40,6 +40,8 @@
     jsonb,
     jsonbBytes,
     jsonbLazyBytes,
+    name,
+    oid,
     enum,
     unknown,
     array,
diff --git a/library/Hasql/Private/Encoders.hs b/library/Hasql/Private/Encoders.hs
--- a/library/Hasql/Private/Encoders.hs
+++ b/library/Hasql/Private/Encoders.hs
@@ -249,6 +249,18 @@
 jsonbLazyBytes = Value (Value.unsafePTIWithShow PTI.jsonb (const A.jsonb_bytes_lazy))
 
 -- |
+-- Encoder of @OID@ values.
+{-# INLINEABLE oid #-}
+oid :: Value Int32
+oid = Value (Value.unsafePTIWithShow PTI.oid (const A.int4_int32))
+
+-- |
+-- Encoder of @NAME@ values.
+{-# INLINEABLE name #-}
+name :: Value Text
+name = Value (Value.unsafePTIWithShow PTI.name (const A.text_strict))
+
+-- |
 -- Given a function,
 -- which maps a value into a textual enum label used on the DB side,
 -- produces an encoder of that value.
@@ -269,7 +281,7 @@
 -- it is the only encoder that doesn't use the binary format.
 {-# INLINEABLE unknown #-}
 unknown :: Value ByteString
-unknown = Value (Value.unsafePTIWithShow PTI.unknown (const A.bytea_strict))
+unknown = Value (Value.unsafePTIWithShow PTI.textUnknown (const A.bytea_strict))
 
 -- |
 -- Lift an array encoder into a value encoder.
@@ -282,7 +294,7 @@
 -- Lift a composite encoder into a value encoder.
 composite :: Composite a -> Value a
 composite (Composite encode print) =
-  Value (Value.unsafePTI PTI.unknown encodeValue printValue)
+  Value (Value.unsafePTI PTI.binaryUnknown encodeValue printValue)
   where
     encodeValue idt val =
       A.composite $ encode val idt
diff --git a/library/Hasql/Private/PTI.hs b/library/Hasql/Private/PTI.hs
--- a/library/Hasql/Private/PTI.hs
+++ b/library/Hasql/Private/PTI.hs
@@ -143,7 +143,9 @@
 
 txid_snapshot = mkPTI LibPQ.Binary 2970 (Just 2949)
 
-unknown = mkPTI LibPQ.Text 705 (Just 705)
+textUnknown = mkPTI LibPQ.Text 705 (Just 705)
+
+binaryUnknown = mkPTI LibPQ.Binary 705 (Just 705)
 
 uuid = mkPTI LibPQ.Binary 2950 (Just 2951)
 
diff --git a/tasty/Main.hs b/tasty/Main.hs
--- a/tasty/Main.hs
+++ b/tasty/Main.hs
@@ -127,6 +127,33 @@
            in do
                 x <- Connection.with (Session.run session)
                 assertEqual (show x) (Right (Right ((1, True), ("hello", 3)))) x,
+        testCase "Composite encoding" $ do
+          let value =
+                (123, 456, 789, "abc")
+          res <-
+            let statement =
+                  Statement.Statement sql encoder decoder True
+                  where
+                    sql =
+                      "select $1 :: pg_enum"
+                    encoder =
+                      Encoders.param . Encoders.nonNullable . Encoders.composite . mconcat $
+                        [ contramap (\(a, _, _, _) -> a) . Encoders.field . Encoders.nonNullable $ Encoders.oid,
+                          contramap (\(_, a, _, _) -> a) . Encoders.field . Encoders.nonNullable $ Encoders.oid,
+                          contramap (\(_, _, a, _) -> a) . Encoders.field . Encoders.nonNullable $ Encoders.float4,
+                          contramap (\(_, _, _, a) -> a) . Encoders.field . Encoders.nonNullable $ Encoders.name
+                        ]
+                    decoder =
+                      Decoders.singleRow $
+                        (Decoders.column . Decoders.nonNullable . Decoders.composite)
+                          ( (,,,)
+                              <$> (Decoders.field . Decoders.nonNullable) Decoders.int4
+                              <*> (Decoders.field . Decoders.nonNullable) Decoders.int4
+                              <*> (Decoders.field . Decoders.nonNullable) Decoders.float4
+                              <*> (Decoders.field . Decoders.nonNullable) Decoders.text
+                          )
+             in Connection.with $ Session.run $ Session.statement value statement
+          assertEqual "" (Right (Right value)) res,
         testCase "Empty array" $
           let io =
                 do
