diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.3.0.1
+
+* The library is now compatible with GHC 8.
+
 # 0.3.0.0
 
 * `SimpleGetter` and `SimpleFold` are no longer reexported.
diff --git a/microlens-th.cabal b/microlens-th.cabal
--- a/microlens-th.cabal
+++ b/microlens-th.cabal
@@ -1,5 +1,5 @@
 name:                microlens-th
-version:             0.3.0.0
+version:             0.3.0.1
 synopsis:            Automatic generation of record lenses for microlens
 description:
   This package lets you automatically generate lenses for data types; code was extracted from the lens package, and therefore generated lenses are fully compatible with ones generated by lens (and can be used both from lens and microlens).
diff --git a/src/Lens/Micro/TH.hs b/src/Lens/Micro/TH.hs
--- a/src/Lens/Micro/TH.hs
+++ b/src/Lens/Micro/TH.hs
@@ -48,7 +48,6 @@
 where
 
 
-import           Control.Applicative
 import           Control.Monad
 import           Data.Char
 import           Data.Data
@@ -66,6 +65,7 @@
 import           Language.Haskell.TH
 
 #if __GLASGOW_HASKELL__ < 710
+import           Control.Applicative
 import           Data.Traversable (traverse, sequenceA)
 #endif
 
@@ -576,11 +576,19 @@
 instance HasName Name where
   name = id
 
+-- | On @template-haskell-2.11.0.0@ or later, if a 'GadtC' or 'RecGadtC' has
+-- multiple 'Name's, the leftmost 'Name' will be chosen.
 instance HasName Con where
   name f (NormalC n tys)       = (`NormalC` tys) <$> f n
   name f (RecC n tys)          = (`RecC` tys) <$> f n
   name f (InfixC l n r)        = (\n' -> InfixC l n' r) <$> f n
   name f (ForallC bds ctx con) = ForallC bds ctx <$> name f con
+#if MIN_VERSION_template_haskell(2,11,0)
+  name f (GadtC ns argTys retTy) =
+    (\n -> GadtC [n] argTys retTy) <$> f (head ns)
+  name f (RecGadtC ns argTys retTy) =
+    (\n -> RecGadtC [n] argTys retTy) <$> f (head ns)
+#endif
 
 -- Provides for the extraction of free type variables, and alpha renaming.
 class HasTypeVars t where
@@ -624,6 +632,14 @@
   typeVarsEx s f (ForallC bs ctx c) =
     ForallC bs <$> typeVarsEx s' f ctx <*> typeVarsEx s' f c
       where s' = s `Set.union` Set.fromList (bs ^.. typeVars)
+#if MIN_VERSION_template_haskell(2,11,0)
+  typeVarsEx s f (GadtC ns argTys retTy) =
+    GadtC ns <$> (traverse . _2) (typeVarsEx s f) argTys
+             <*> typeVarsEx s f retTy
+  typeVarsEx s f (RecGadtC ns argTys retTy) =
+    RecGadtC ns <$> (traverse . _3) (typeVarsEx s f) argTys
+                <*> typeVarsEx s f retTy
+#endif
 
 instance HasTypeVars t => HasTypeVars [t] where
   typeVarsEx s = traverse . typeVarsEx s
@@ -658,6 +674,16 @@
 
 makeFieldOpticsForDec :: LensRules -> Dec -> DecsQ
 makeFieldOpticsForDec rules dec = case dec of
+#if MIN_VERSION_template_haskell(2,11,0)
+  DataD    _ tyName vars _ cons _ ->
+    makeFieldOpticsForDec' rules tyName (mkS tyName vars) cons
+  NewtypeD _ tyName vars _ con  _ ->
+    makeFieldOpticsForDec' rules tyName (mkS tyName vars) [con]
+  DataInstD _ tyName args _ cons _ ->
+    makeFieldOpticsForDec' rules tyName (tyName `conAppsT` args) cons
+  NewtypeInstD _ tyName args _ con _ ->
+    makeFieldOpticsForDec' rules tyName (tyName `conAppsT` args) [con]
+#else
   DataD    _ tyName vars cons _ ->
     makeFieldOpticsForDec' rules tyName (mkS tyName vars) cons
   NewtypeD _ tyName vars con  _ ->
@@ -666,6 +692,7 @@
     makeFieldOpticsForDec' rules tyName (tyName `conAppsT` args) cons
   NewtypeInstD _ tyName args con _ ->
     makeFieldOpticsForDec' rules tyName (tyName `conAppsT` args) [con]
+#endif
   _ -> fail "makeFieldOptics: Expected data or newtype type-constructor"
   where
   mkS tyName vars = tyName `conAppsT` map VarT (vars ^.. typeVars)
@@ -707,6 +734,8 @@
 -- Normalized the Con type into a uniform positional representation,
 -- eliminating the variance between records, infix constructors, and normal
 -- constructors.
+-- 
+-- For 'GadtC' and 'RecGadtC', the leftmost name is chosen.
 normalizeConstructor ::
   Con ->
   Q (Name, [(Maybe Name, Type)]) -- constructor name, field name, field type
@@ -724,6 +753,13 @@
   do con' <- normalizeConstructor con
      return (set (_2 . mapped . _1) Nothing con')
 
+#if MIN_VERSION_template_haskell(2,11,0)
+normalizeConstructor (GadtC ns xs _) =
+  return (head ns, [ (Nothing, ty) | (_,ty) <- xs])
+ 
+normalizeConstructor (RecGadtC ns xs _) =
+  return (head ns, [ (Just fieldName, ty) | (fieldName,_,ty) <- xs])
+#endif
 
 data OpticType = GetterType | LensType -- or IsoType
 
