diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+#### 0.1.0.4
+
+* Fix build on GHC 8.
+
 #### 0.1.0.3
 
 * Allow `generic-deriving 1.8.*`.
diff --git a/generic-xmlpickler.cabal b/generic-xmlpickler.cabal
--- a/generic-xmlpickler.cabal
+++ b/generic-xmlpickler.cabal
@@ -1,5 +1,5 @@
 name:                generic-xmlpickler
-version:             0.1.0.4
+version:             0.1.0.5
 description:         Generic generation of HXT XmlPickler instances using GHC Generics.
 synopsis:            Generic generation of HXT XmlPickler instances using GHC Generics.
 category:            XML, Data
@@ -26,8 +26,8 @@
   hs-source-dirs:    src
   exposed-modules:   Generics.XmlPickler
   build-depends:
-      base >= 4.5 && < 4.9
-    , generic-deriving >= 1.6 && < 1.10
+      base >= 4.5 && < 4.10
+    , generic-deriving >= 1.6 && < 1.11
     , hxt >= 9.2 && < 9.4
     , text
   if impl(ghc < 7.6)
diff --git a/src/Generics/XmlPickler.hs b/src/Generics/XmlPickler.hs
--- a/src/Generics/XmlPickler.hs
+++ b/src/Generics/XmlPickler.hs
@@ -1,12 +1,18 @@
 {-# OPTIONS -fno-warn-orphans #-}
 {-# LANGUAGE
-    FlexibleContexts
+    CPP
+  , FlexibleContexts
   , FlexibleInstances
   , KindSignatures
-  , OverlappingInstances
   , ScopedTypeVariables
   , TypeOperators
   #-}
+#if MIN_VERSION_base(4,9,0)
+{-# LANGUAGE DataKinds #-}
+#endif
+#if __GLASGOW_HASKELL__ < 710
+{-# LANGUAGE OverlappingInstances #-}
+#endif
 module Generics.XmlPickler
   ( gxpickle
   , GXmlPickler (..)
@@ -115,21 +121,41 @@
 
 -- * GXmlPickler instance for String, Text and Maybes.
 
+#if __GLASGOW_HASKELL__ >= 710
+instance {-# OVERLAPS #-} GXmlPickler (K1 i String) where
+#else
 instance GXmlPickler (K1 i String) where
+#endif
   gxpicklef _ = (K1, unK1) `xpWrap` xpText0
 
+#if __GLASGOW_HASKELL__ >= 710
+instance {-# OVERLAPS #-} GXmlPickler (K1 i Text) where
+#else
 instance GXmlPickler (K1 i Text) where
+#endif
   gxpicklef _ = (K1 . pack, unpack . unK1) `xpWrap` xpText0
 
+#if __GLASGOW_HASKELL__ >= 710
+instance {-# OVERLAPS #-} (XmlPickler a, Selector c) => GXmlPickler (M1 S c (K1 i (Maybe a))) where
+#else
 instance (XmlPickler a, Selector c) => GXmlPickler (M1 S c (K1 i (Maybe a))) where
+#endif
   gxpicklef _ = (M1 . K1, unK1 . unM1)
          `xpWrap` xpOption (optElem xpickle (undefined :: M1 S c f p))
 
+#if __GLASGOW_HASKELL__ >= 710
+instance {-# OVERLAPS #-} Selector c => GXmlPickler (M1 S c (K1 i (Maybe String))) where
+#else
 instance Selector c => GXmlPickler (M1 S c (K1 i (Maybe String))) where
+#endif
   gxpicklef _ = (M1 . K1, unK1 . unM1)
          `xpWrap` xpOption (optElem xpText0 (undefined :: M1 S c f p))
 
+#if __GLASGOW_HASKELL__ >= 710
+instance {-# OVERLAPS #-} Selector c => GXmlPickler (M1 S c (K1 i (Maybe Text))) where
+#else
 instance Selector c => GXmlPickler (M1 S c (K1 i (Maybe Text))) where
+#endif
   gxpicklef _ = (M1 . K1 . fmap pack, fmap unpack . unK1 . unM1)
          `xpWrap` xpOption (optElem xpText0 (undefined :: M1 S c f p))
 
@@ -157,7 +183,11 @@
   [x,'_'] -> [x]
   (x:xs)  -> x : stripTrailingUnderscore xs
 
+#if MIN_VERSION_base(4,9,0)
+optElem :: forall (t :: * -> Meta -> (* -> *) -> * -> *) i (s :: Meta) (f :: * -> *) p a. Selector s => PU a -> t i s f p -> PU a
+#else
 optElem :: forall a s (t :: * -> (* -> *) -> * -> *) (f :: * -> *) b. Selector s => PU a -> t s f b -> PU a
+#endif
 optElem x y = case formatElement (selName y) of
   "" -> x
   n  -> n `xpElem` x
