diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+# 0.2.0.0
+
+- Remove `Generic.Data.Types.Map`
+- Add `Generic.Data.Data.Types.toData` and `fromData`
+- Remove `Defun` module (subsumed by `first-class-families` package)
+
 # 0.1.1.0
 
 - Add `gconIndex`
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Generic data types in Haskell [![Build Status](https://travis-ci.org/Lysxia/generic-data.svg)](https://travis-ci.org/Lysxia/generic-data)
+# Generic data types in Haskell [![Hackage](https://img.shields.io/hackage/v/generic-data.svg)](https://hackage.haskell.org/package/generic-data) [![Build Status](https://travis-ci.org/Lysxia/generic-data.svg)](https://travis-ci.org/Lysxia/generic-data)
 
 Utilities for `GHC.Generics`.
 
@@ -13,6 +13,8 @@
 - `Eq`, `Ord`, `Enum`, `Bounded`, `Show` (standard);
 - `Functor`, `Foldable`, `Traversable` (via extensions, `DeriveFunctor`, etc.).
 
+(`Read` is currently not implemented.)
+
 To derive type classes defined elsewhere, it might be worth taking a look at
 [one-liner](https://hackage.haskell.org/package/one-liner).
 
@@ -24,13 +26,13 @@
 
 ## Related links
 
-generic-data aims to subsume the following packages, which may still be
-useful for old versions of GHC and base not supported by generic-data.
+generic-data aims to subsume generic deriving features of the following
+packages:
 
 - [semigroups](https://hackage.haskell.org/package/semigroups): generic
-  `Semigroup`, `Monoid`.
+  `Semigroup`, `Monoid`, but with a heavy dependency footprint.
 - [transformers-compat](https://hackage.haskell.org/package/transformers-compat):
-  generic `Eq1`, `Ord1`, `Show1`, `Read1`.
+  generic `Eq1`, `Ord1`, `Show1`.
 - [generic-deriving](https://hackage.haskell.org/package/generic-deriving):
   doesn't derive the classes in base (defines clones of these classes as a toy
   example); has Template Haskell code to derive `Generic`.
@@ -43,8 +45,10 @@
   to using `GHC.Generics` to derive instances of many type classes, including
   but not restricted to the above classes (this is done in
   [one-liner-instances](https://hackage.haskell.org/package/one-liner-instances)).
-- [singletons](https://hackage.haskell.org/package/singletons):
-  generic-data borrows code from this package to implement defunctionalization.
+- [singletons](https://hackage.haskell.org/package/singletons),
+  [first-class-families](https://hackage.haskell.org/package/first-class-families)
+  (second one written by me)
+  libraries for dependently-typed programming in Haskell.
 
 ---
 
diff --git a/generic-data.cabal b/generic-data.cabal
--- a/generic-data.cabal
+++ b/generic-data.cabal
@@ -1,5 +1,5 @@
 name:                generic-data
-version:             0.1.1.0
+version:             0.2.0.0
 synopsis:            Utilities for GHC.Generics
 description:         This package provides common functions on generic types.
                      See README.
@@ -13,7 +13,7 @@
 build-type:          Simple
 extra-source-files:  README.md, CHANGELOG.md
 cabal-version:       >=1.10
-tested-with:         GHC == 8.0.2, GHC == 8.2.2
+tested-with:         GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.3, GHC == 8.6.1
 
 library
   hs-source-dirs:      src
@@ -22,7 +22,6 @@
     Generic.Data.Types
     Generic.Data.Internal.Compat
     Generic.Data.Internal.Data
-    Generic.Data.Internal.Defun
     Generic.Data.Internal.Enum
     Generic.Data.Internal.Functions
     Generic.Data.Internal.Generically
@@ -31,7 +30,9 @@
     Generic.Data.Internal.Prelude
     Generic.Data.Internal.Resolvers
     Generic.Data.Internal.Show
+    Generic.Data.Internal.Utils
   build-depends:
+    base-orphans >= 0.8,
     contravariant,
     show-combinators,
     base >= 4.9 && < 5
diff --git a/orphans/Generic/Data/Orphans.hs b/orphans/Generic/Data/Orphans.hs
--- a/orphans/Generic/Data/Orphans.hs
+++ b/orphans/Generic/Data/Orphans.hs
@@ -8,44 +8,9 @@
 module Generic.Data.Orphans where
 
 import Data.Functor.Classes
+import Data.Orphans ()
 import Data.Semigroup
 import GHC.Generics
-
-instance Monoid c => Applicative (K1 i c) where
-  pure _ = K1 mempty
-  K1 a <*> K1 b = K1 (mempty a b)
-
-instance Semigroup (V1 p) where
-  v <> _ = v
-
-instance Semigroup (U1 p) where
-  _ <> _ = U1
-
-instance Monoid (U1 p) where
-  mempty = U1
-  mappend = (<>)
-
-deriving instance Semigroup c => Semigroup (K1 i c p)
-deriving instance Monoid c => Monoid (K1 i c p)
-
-deriving instance Semigroup (f p) => Semigroup (M1 i c f p)
-deriving instance Monoid (f p) => Monoid (M1 i c f p)
-
-instance (Semigroup (f p), Semigroup (g p)) => Semigroup ((f :*: g) p) where
-  (x1 :*: y1) <> (x2 :*: y2) = (x1 <> x2) :*: (y1 <> y2)
-
-instance (Monoid (f p), Monoid (g p)) => Monoid ((f :*: g) p) where
-  mempty = mempty :*: mempty
-  mappend (x1 :*: y1) (x2 :*: y2) = mappend x1 x2 :*: mappend y1 y2
-
-deriving instance Semigroup p => Semigroup (Par1 p)
-deriving instance Monoid p => Monoid (Par1 p)
-
-deriving instance Semigroup (f p) => Semigroup (Rec1 f p)
-deriving instance Monoid (f p) => Monoid (Rec1 f p)
-
-deriving instance Semigroup (f (g p)) => Semigroup ((f :.: g) p)
-deriving instance Monoid (f (g p)) => Monoid ((f :.: g) p)
 
 instance Eq1 V1 where
   liftEq _ v _ = case v of {}
diff --git a/src/Generic/Data/Internal/Compat.hs b/src/Generic/Data/Internal/Compat.hs
--- a/src/Generic/Data/Internal/Compat.hs
+++ b/src/Generic/Data/Internal/Compat.hs
@@ -1,10 +1,17 @@
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE
+    CPP,
+    DataKinds,
+    TypeFamilies,
+    TypeOperators,
+    UndecidableInstances #-}
 
 module Generic.Data.Internal.Compat
   ( readPrec1
+  , Div
   ) where
 
 import Data.Functor.Classes
+import GHC.TypeLits
 
 #if !MIN_VERSION_base(4,10,0)
 import Text.ParserCombinators.ReadPrec (ReadPrec, readS_to_Prec)
@@ -14,4 +21,13 @@
 #if !MIN_VERSION_base(4,10,0)
 readPrec1 :: (Read1 f, Read a) => ReadPrec (f a)
 readPrec1 = readS_to_Prec $ liftReadsPrec readsPrec readList
+#endif
+
+#if !MIN_VERSION_base(4,11,0)
+type Div m n = Div' (CmpNat m n) m n
+
+type family   Div' (ord :: Ordering) (m :: Nat) (n :: Nat) :: Nat
+type instance Div' 'LT m n = 0
+type instance Div' 'GT m n = 1 + Div (m-n) n
+type instance Div' 'EQ m n = 1
 #endif
diff --git a/src/Generic/Data/Internal/Data.hs b/src/Generic/Data/Internal/Data.hs
--- a/src/Generic/Data/Internal/Data.hs
+++ b/src/Generic/Data/Internal/Data.hs
@@ -20,15 +20,23 @@
 import Generic.Data.Internal.Enum
 import Generic.Data.Internal.Show
 
--- | A wrapper to view a generic 'Rep' as the datatype it's supposed
--- to represent, without needing a declaration.
+-- | Synthetic data type.
 --
--- This can be used to derive types from generic types, and get some instances
--- for free, in particular 'Generic', 'Show', 'Enum', 'Bounded'.
+-- A wrapper to view a generic 'Rep' as the datatype it's supposed to
+-- represent, without needing a declaration.
 newtype Data r p = Data { unData :: r p }
   deriving ( Functor, Foldable, Traversable, Applicative, Alternative
            , Monad, MonadPlus, Contravariant
            , Eq, Ord, Eq1, Ord1, Semigroup, Monoid )
+
+-- | Conversion between a generic type and the synthetic type made using its
+-- representation.
+toData :: Generic a => a -> Data (Rep a) p
+toData = Data . from
+
+-- | Inverse of 'fromData'.
+fromData :: Generic a => Data (Rep a) p -> a
+fromData = to . unData
 
 instance (Functor r, Contravariant r) => Generic (Data r p) where
   type Rep (Data r p) = r
diff --git a/src/Generic/Data/Internal/Defun.hs b/src/Generic/Data/Internal/Defun.hs
deleted file mode 100644
--- a/src/Generic/Data/Internal/Defun.hs
+++ /dev/null
@@ -1,38 +0,0 @@
-{- | Defunctionalization
-
-See https://hackage.haskell.org/package/singletons-2.4.1/docs/src/Data-Singletons-Internal.html#TyFun
-
-A copy of the defunctionalization implementation in the singletons package, to
-not pull in too heavy dependencies.
-
--}
-
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE PolyKinds #-}
-{-# LANGUAGE TypeFamilies #-}
-{-# LANGUAGE TypeOperators #-}
-
-module Generic.Data.Internal.Defun where
-
-import Data.Kind
-
-data TyFun :: Type -> Type -> Type
-
--- | Kind of function symbols
-type a ~> b = TyFun a b -> Type
-infixr 0 ~>
-
-type family (f :: TyFun k1 k2 -> Type) @@ (x :: k1) :: k2
-infixl 9 @@
-
--- | Type constructor function symbol
-data TyCon :: (k1 -> k2) -> TyFun k1 k2 -> Type
-type instance TyCon f @@ x = f x
-
--- | Identity function symbol
-data Id :: TyFun k1 k2 -> Type
-type instance Id @@ x = x
-
--- | Constant function symbol
-data Const :: k2 -> TyFun k1 k2 -> Type
-type instance Const t @@ x = t
diff --git a/src/Generic/Data/Internal/Functions.hs b/src/Generic/Data/Internal/Functions.hs
--- a/src/Generic/Data/Internal/Functions.hs
+++ b/src/Generic/Data/Internal/Functions.hs
@@ -17,17 +17,6 @@
 import GHC.Generics
 import GHC.TypeLits
 
-import Generic.Data.Internal.Defun
-
--- | Apply a type function on every field of a type.
-type family   Map (s :: TyFun a b -> Type) (r :: k -> Type) :: k -> Type
-type instance Map s (M1 i c f) = M1 i c (Map s f)
-type instance Map s (f :+: g)  = Map s f :+: Map s g
-type instance Map s (f :*: g)  = Map s f :*: Map s g
-type instance Map s (K1 i c)   = K1 i (s @@ c)
-type instance Map s U1 = U1
-type instance Map s V1 = V1
-
 -- | Number of constructors of a data type.
 type family   NConstructors (r :: k -> Type) :: Nat
 type instance NConstructors (M1 D c f) = NConstructors f
diff --git a/src/Generic/Data/Internal/Meta.hs b/src/Generic/Data/Internal/Meta.hs
--- a/src/Generic/Data/Internal/Meta.hs
+++ b/src/Generic/Data/Internal/Meta.hs
@@ -264,3 +264,10 @@
 -- | Inferred strictness of a field ('MetaSel').
 type family MetaSelStrictness (m :: Meta) :: DecidedStrictness where
   MetaSelStrictness ('MetaSel _mn _su _ss ds) = ds
+
+-- | A placeholder for 'Meta' values.
+type DummyMeta = 'MetaData "" "" "" 'False
+
+-- | Remove an 'M1' type constructor.
+type family   UnM1 (f :: k -> *) :: k -> *
+type instance UnM1 (M1 i c f) = f
diff --git a/src/Generic/Data/Internal/Prelude.hs b/src/Generic/Data/Internal/Prelude.hs
--- a/src/Generic/Data/Internal/Prelude.hs
+++ b/src/Generic/Data/Internal/Prelude.hs
@@ -10,6 +10,8 @@
 import Data.Semigroup
 import GHC.Generics
 
+import Generic.Data.Internal.Utils (from', to', liftG2)
+
 -- * 'Eq'
 
 -- | Generic @('==')@.
@@ -184,17 +186,3 @@
   :: (Generic1 f, Ord1 (Rep1 f))
   => (a -> b -> Ordering) -> f a -> f b -> Ordering
 gliftCompare = \compare' a b -> liftCompare compare' (from1 a) (from1 b)
-
--- * Utils
-
--- | A helper for better type inference.
-from' :: Generic a => a -> Rep a ()
-from' = from
-
--- | A helper for better type inference.
-to' :: Generic a => Rep a () -> a
-to' = to
-
--- | Lift binary combinators generically.
-liftG2 :: Generic1 f => (Rep1 f a -> Rep1 f b -> Rep1 f c) -> f a -> f b -> f c
-liftG2 = \(<?>) a b -> to1 (from1 a <?> from1 b)
diff --git a/src/Generic/Data/Internal/Utils.hs b/src/Generic/Data/Internal/Utils.hs
new file mode 100644
--- /dev/null
+++ b/src/Generic/Data/Internal/Utils.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE
+    BangPatterns,
+    PolyKinds #-}
+
+module Generic.Data.Internal.Utils where
+
+import Data.Coerce
+import GHC.Generics
+
+-- | Coerce while preserving the type index.
+coerce' :: Coercible (f x) (g x) => f x -> g x
+coerce' = coerce
+
+-- | Elimination of @V1@.
+absurd1 :: V1 x -> a
+absurd1 !_ = error "impossible"
+
+-- | A helper for better type inference.
+from' :: Generic a => a -> Rep a ()
+from' = from
+
+-- | A helper for better type inference.
+to' :: Generic a => Rep a () -> a
+to' = to
+
+-- | Lift binary combinators generically.
+liftG2 :: Generic1 f => (Rep1 f a -> Rep1 f b -> Rep1 f c) -> f a -> f b -> f c
+liftG2 = \(<?>) a b -> to1 (from1 a <?> from1 b)
diff --git a/src/Generic/Data/Types.hs b/src/Generic/Data/Types.hs
--- a/src/Generic/Data/Types.hs
+++ b/src/Generic/Data/Types.hs
@@ -4,17 +4,8 @@
 
 module Generic.Data.Types
   ( Data(..)
-  , Map
-
-    -- * Defunctionalization
-  , TyFun
-  , type (~>)
-  , type (@@)
-  , Id
-  , TyCon
-  , Const
+  , toData
+  , fromData
   ) where
 
 import Generic.Data.Internal.Data
-import Generic.Data.Internal.Defun
-import Generic.Data.Internal.Functions
diff --git a/test/unit.hs b/test/unit.hs
--- a/test/unit.hs
+++ b/test/unit.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE TypeApplications #-}
 
@@ -42,6 +43,13 @@
 data E = E0 | E1 | E2
   deriving (Eq, Show, Generic)
 
+maybeModuleName :: String
+#if MIN_VERSION_base(4,12,0)
+maybeModuleName = "GHC.Maybe"
+#else
+maybeModuleName = "GHC.Base"
+#endif
+
 main :: IO ()
 main = defaultMain test
 
@@ -100,7 +108,7 @@
 
   , testGroup "Meta"
       [ testCase "datatypeName" $ "Maybe" @?= gdatatypeName @(Maybe Int)
-      , testCase "moduleName" $ "GHC.Base" @?= gmoduleName @(Maybe Int)
+      , testCase "moduleName" $ maybeModuleName @?= gmoduleName @(Maybe Int)
       , testCase "packageName" $ "base" @?= gpackageName @(Maybe Int)
       , testCase "isNewtype" $ False @?= gisNewtype @(Maybe Int)
       , testCase "conName" $ "Just" @?= gconName (Just ())
