diff --git a/composite-opaleye.cabal b/composite-opaleye.cabal
--- a/composite-opaleye.cabal
+++ b/composite-opaleye.cabal
@@ -1,11 +1,7 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.34.7.
---
--- see: https://github.com/sol/hpack
-
 name:           composite-opaleye
-version:        0.8.2.1
+version:        0.8.2.2
 synopsis:       Opaleye SQL for Vinyl records
 description:    Integration between Vinyl records and Opaleye SQL, allowing records to be stored, retrieved, and queried from PostgreSQL.
 category:       Records
@@ -21,6 +17,7 @@
       Composite.Opaleye
       Composite.Opaleye.ProductProfunctors
       Composite.Opaleye.RecordTable
+      Composite.Opaleye.RecToFields
       Composite.Opaleye.TH
       Composite.Opaleye.Update
       Composite.Opaleye.Util
@@ -48,7 +45,7 @@
       base >=4.12 && <5
     , bytestring >=0.10.8.1 && <0.12
     , composite-base ==0.8.*
-    , lens >=4.15.4 && <5.2
+    , lens >=4.15.4 && <5.3
     , opaleye >=0.9.0 && <0.10
     , postgresql-simple >=0.5.3.0 && <0.7
     , product-profunctors >=0.8.0.3 && <0.12
@@ -90,7 +87,7 @@
     , composite-base ==0.8.*
     , composite-opaleye
     , hspec
-    , lens >=4.15.4 && <5.2
+    , lens >=4.15.4 && <5.3
     , opaleye >=0.9.0 && <0.10
     , postgresql-simple >=0.5.3.0 && <0.7
     , product-profunctors >=0.8.0.3 && <0.12
diff --git a/src/Composite/Opaleye.hs b/src/Composite/Opaleye.hs
--- a/src/Composite/Opaleye.hs
+++ b/src/Composite/Opaleye.hs
@@ -1,9 +1,11 @@
 module Composite.Opaleye
   ( module Composite.Opaleye.ProductProfunctors
   , module Composite.Opaleye.RecordTable
+  , module Composite.Opaleye.RecToFields
   , module Composite.Opaleye.Update
   ) where
 
 import Composite.Opaleye.ProductProfunctors
 import Composite.Opaleye.RecordTable
+import Composite.Opaleye.RecToFields
 import Composite.Opaleye.Update
diff --git a/src/Composite/Opaleye/ProductProfunctors.hs b/src/Composite/Opaleye/ProductProfunctors.hs
--- a/src/Composite/Opaleye/ProductProfunctors.hs
+++ b/src/Composite/Opaleye/ProductProfunctors.hs
@@ -3,6 +3,7 @@
 
 import Composite.Record ((:->)(Val), Rec((:&), RNil))
 import Data.Functor.Identity (Identity(Identity))
+import Data.Kind (Type)
 import Data.Profunctor (dimap)
 import Data.Profunctor.Product (ProductProfunctor, (***!))
 import qualified Data.Profunctor.Product as PP
@@ -14,9 +15,9 @@
 -- This is similar to the @pN@ functions on tuples provided by the @product-profunctors@ library.
 class ProductProfunctor p => PRec p rs where
   -- |Record fields @rs@ with the profunctor removed yielding the contravariant parameter. E.g. @PRecContra p '[p a b] ~ '[a]@
-  type PRecContra p rs :: [*]
+  type PRecContra p rs :: [Type]
   -- |Record fields @rs@ with the profunctor removed yielding the covariant parameter. E.g. @PRecContra p '[p a b] ~ '[a]@
-  type PRecCo     p rs :: [*]
+  type PRecCo     p rs :: [Type]
 
   -- |Traverse the record, transposing the profunctors @p@ within to the outside like 'traverse' does for Applicative effects.
   --
@@ -52,6 +53,3 @@
       step = def
       recur :: p (Rec Identity rsContra) (Rec Identity rsCo)
       recur = def
-
-
-
diff --git a/src/Composite/Opaleye/RecToFields.hs b/src/Composite/Opaleye/RecToFields.hs
new file mode 100644
--- /dev/null
+++ b/src/Composite/Opaleye/RecToFields.hs
@@ -0,0 +1,16 @@
+module Composite.Opaleye.RecToFields where
+
+import Composite.Record (pattern (:*:), Rec((:&), RNil), (:->)(Val))
+import Data.Functor.Identity (Identity(Identity))
+import Data.Kind (Type)
+import Data.Profunctor.Product.Default (Default)
+import Opaleye (ToFields, toFields)
+
+class RecToFields (haskells :: [Type]) (fields :: [Type]) where
+  recToFields :: Rec Identity haskells -> Rec Identity fields
+
+instance RecToFields '[] '[] where
+  recToFields RNil = RNil
+
+instance (Default ToFields h f, RecToFields haskells fields) => RecToFields (s :-> h ': haskells) (s :-> f ': fields) where
+  recToFields hs' = let Identity (Val h) :& hs = hs' in toFields h :*: recToFields hs
diff --git a/src/Composite/Opaleye/Update.hs b/src/Composite/Opaleye/Update.hs
--- a/src/Composite/Opaleye/Update.hs
+++ b/src/Composite/Opaleye/Update.hs
@@ -5,10 +5,11 @@
 
 import Composite.Record ((:->)(Val), Rec((:&), RNil), Record)
 import Data.Functor.Identity (Identity(Identity))
+import Data.Kind (Type)
 
 -- |Typeclass which allows transformation of a record from its select form to neutral update form, which boils down to wrapping fields that have defaults
 -- with 'Just'.
-class RecordToUpdate (rs :: [*]) (ss :: [*]) where
+class RecordToUpdate (rs :: [Type]) (ss :: [Type]) where
   -- |Transform a @'Record' rs@ obtained from the database to a @'Record' ss@ representing an updated version of the row.
   --
   -- Opaleye's @runUpdate@ family of functions all take an update function of the type @columnsR -> columnsW@, which this function implements generically
@@ -31,4 +32,3 @@
 instance RecordToUpdate rs ss => RecordToUpdate (s :-> a ': rs) (s :-> Maybe a ': ss) where
   recordToUpdate (Identity (Val a) :& rs) = Identity (Val (Just a)) :& recordToUpdate rs
   {-# INLINE recordToUpdate #-}
-
