diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+0.2.1
+------
+
+* Workaround for the GHC 8.2.1 attribute generation bug
+
+* Add tests checking run-time behaviour of generated code
+
 0.2.0
 -------
 
diff --git a/src/Data/THGen/XML.hs b/src/Data/THGen/XML.hs
--- a/src/Data/THGen/XML.hs
+++ b/src/Data/THGen/XML.hs
@@ -392,7 +392,8 @@
             XmlFieldPluralMandatory  -> [e|id|]
             _                        -> [e|traverse|]
           exprFieldValue   = [e|$(TH.varE fName) $(TH.varE objName)|]
-          exprFieldRender  = [e|mkElement $exprFieldStrName|]
+          exprFieldRender  =
+            [e|(\a -> XW.elementA $exprFieldStrName (toXmlParentAttributes a) a)|]
         return [e|$exprForField $exprFieldRender $exprFieldValue|]
       toXmlExpr
         = TH.lamE [if null exprFields then TH.wildP else TH.varP objName]
@@ -422,16 +423,17 @@
       toXmlParentAttributesExpr
         = TH.lamE [if null exprAttributes then TH.wildP else TH.varP objName]
         $ [e|mapMaybe distribPair $(TH.listE exprAttributes)|]
+#if __GLASGOW_HASKELL__ < 800
     TH.instanceD
+#else
+    TH.instanceWithOverlapD (Just TH.Overlapping)
+#endif
       (return [])
       [t|ToXmlParentAttributes $(TH.conT name)|]
       [funSimple 'toXmlParentAttributes toXmlParentAttributesExpr]
 
   return $ [dataDecl] ++ lensDecls ++
     [fromDomInst, toXmlInst, toXmlParentAttributesInst]
-
-mkElement :: (XW.ToXML a, ToXmlParentAttributes a) => X.Name -> a -> XW.XML
-mkElement name a = XW.elementA name (toXmlParentAttributes a) a
 
 distribPair :: Functor f => (a, f b) -> f (a, b)
 distribPair (a, fb) = (a,) <$> fb
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -1,7 +1,31 @@
 {-# OPTIONS -fno-warn-unused-imports #-}
 module Main where
 
+import Control.Exception
+import Text.XML
+import Data.Default
+import System.IO.Unsafe
+import Test.Hspec
+import Test.Hspec.QuickCheck
+import Test.QuickCheck
 import TestDefs
+import Text.XML.DOM.Parser
+import Text.XML.Writer
 
+isomorphicFoo :: XmlRoot -> Property
+isomorphicFoo a = a === isogen
+  where
+    isogen :: XmlRoot
+    isogen =
+      let
+        doc = document "Root" $ toXML a
+        res = case runDomParser doc fromDom of
+          Left e -> unsafePerformIO $ do
+            pprint doc
+            throwIO e
+          Right a' -> a'
+      in res
+
 main :: IO ()
-main = return ()
+main = hspec $ do
+  prop "isomorphic" isomorphicFoo
diff --git a/test/TestDefs.hs b/test/TestDefs.hs
--- a/test/TestDefs.hs
+++ b/test/TestDefs.hs
@@ -1,12 +1,14 @@
 {-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TemplateHaskell #-}
 
 {-# OPTIONS -ddump-splices #-}
 
 module TestDefs where
 
+import Data.List.NonEmpty
 import Data.THGen.XML
+import GHC.Generics (Generic)
+import Test.QuickCheck.Arbitrary.Generic
+import Test.QuickCheck.Instances ()
 
 "Bar" =:= enum
   & "baroque"
@@ -25,3 +27,25 @@
   + "Bar"
   ? "Baz" [t|Text|]
   !% "Quux"
+  ?% "Muux" [t|XmlQuux|]
+
+"Root" =:= record
+  ! "Foo"
+
+deriving instance Generic XmlRoot
+
+instance Arbitrary XmlRoot where
+  arbitrary = genericArbitrary
+  shrink = genericShrink
+
+deriving instance Generic XmlFoo
+
+instance Arbitrary XmlFoo where
+  arbitrary = genericArbitrary
+  shrink = genericShrink
+
+#if __GLASGOW_HASKELL__ < 800
+instance Arbitrary (NonEmpty XmlBar) where
+  arbitrary = genericArbitrary
+  shrink = genericShrink
+#endif
diff --git a/xml-isogen.cabal b/xml-isogen.cabal
--- a/xml-isogen.cabal
+++ b/xml-isogen.cabal
@@ -1,5 +1,5 @@
 name:                xml-isogen
-version:             0.2.0
+version:             0.2.1
 synopsis:            Generate XML-isomorphic types
 description:
     TemplateHaskell generators for XML-isomorphic data types, including
@@ -28,8 +28,8 @@
 
 library
   exposed-modules:     Data.THGen.Enum
-                       Data.THGen.XML
-                       Text.XML.ParentAttributes
+                     , Data.THGen.XML
+                     , Text.XML.ParentAttributes
   other-modules:       Data.THGen.Compat
   build-depends:       QuickCheck >= 2.8
                      , base >=4.8 && <5
@@ -45,17 +45,37 @@
   hs-source-dirs:      src
 
   default-language:    Haskell2010
-  default-extensions:  TemplateHaskell
-                       LambdaCase
-                       FlexibleInstances
-                       TypeFamilies
-                       TupleSections
+  default-extensions:  CPP
+                     , FlexibleInstances
+                     , LambdaCase
+                     , TemplateHaskell
+                     , TupleSections
+                     , TypeFamilies
 
 test-suite spec
   type:               exitcode-stdio-1.0
   hs-source-dirs:     test
   main-is:            Main.hs
   other-modules:      TestDefs
-  build-depends:      base, xml-isogen
+  build-depends:      base
+                    , QuickCheck
+                    , data-default
+                    , dom-parser
+                    , generic-arbitrary
+                    , hspec
+                    , quickcheck-instances
+                    , semigroups
+                    , xml-conduit
+                    , xml-conduit-writer
+                    , xml-isogen
   default-language:   Haskell2010
+  default-extensions:  CPP
+                     , DeriveGeneric
+                     , FlexibleInstances
+                     , LambdaCase
+                     , OverloadedStrings
+                     , StandaloneDeriving
+                     , TemplateHaskell
+                     , TupleSections
+                     , TypeFamilies
   ghc-options:        -Wall -fno-warn-missing-signatures
