diff --git a/avro.cabal b/avro.cabal
--- a/avro.cabal
+++ b/avro.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 6ce25074d44e607f3bbf1f81921a61fe9d8ea37a5cbde2000d26607b4d04d85a
+-- hash: a7df532e971306f0e8b7c7ff21ecb95e20f336d396ec72f86154b1df850f7ee7
 
 name:           avro
-version:        0.3.1.2
+version:        0.3.2.0
 synopsis:       Avro serialization support for Haskell
 description:    Avro serialization and deserialization support for Haskell
 category:       Data
diff --git a/src/Data/Avro/Deriving.hs b/src/Data/Avro/Deriving.hs
--- a/src/Data/Avro/Deriving.hs
+++ b/src/Data/Avro/Deriving.hs
@@ -39,6 +39,7 @@
 import           Data.Semigroup                ((<>))
 import           GHC.Generics                  (Generic)
 import           Language.Haskell.TH           as TH
+import           Language.Haskell.TH.Lib       as TH
 import           Language.Haskell.TH.Syntax
 
 import           Data.Avro.Deriving.NormSchema
@@ -200,6 +201,9 @@
             schema = pure $(varE sname)
       |]
 
+newNames :: String {- ^ base name -} -> Int {- ^ count -} -> Q [Name]
+newNames base n = sequence [ newName (base++show i) | i <- [1..n] ]
+
 genToAvro :: DeriveOptions -> Schema -> Q [Dec]
 genToAvro opts s@(Enum n _ _ _ vs _) =
   toAvroInstance (mkSchemaValueName n)
@@ -221,11 +225,15 @@
       [d| instance ToAvro $(conT $ mkDataTypeName n) where
             toAvro = $(genToAvroFieldsExp sname)
       |]
-    genToAvroFieldsExp sname = [| \r -> record $(varE sname)
-        $(let assign fld = [| T.pack $(mkTextLit (fldName fld)) .= $(varE $ mkTextName $ (fieldNameBuilder opts) n fld) r |]
-          in listE $ assign <$> fs
-        )
-      |]
+    genToAvroFieldsExp sname = do
+      names <- newNames "p_" (length fs)
+      let con = conP (mkDataTypeName n) (varP <$> names)
+      lamE [con]
+            [| record $(varE sname)
+                $(let assign (fld, n) = [| T.pack $(mkTextLit (fldName fld)) .= $(varE n) |]
+                  in listE $ assign <$> zip fs names
+                )
+            |]
 
 genToAvro opts s@(Fixed n _ _ size) =
   toAvroInstance (mkSchemaValueName n)
@@ -244,7 +252,8 @@
       x = $(schemaDef' sch)
   |]
 
-schemaDef' sch = mkSchema sch
+schemaDef' :: S.Type -> ExpQ
+schemaDef' = mkSchema
   where mkSchema = \case
           Null           -> [e| Null |]
           Boolean        -> [e| Boolean |]
