diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
 #### 0.2.0.6
 
 * Fix compilation on GHC-7.6
+* (revision) Allow `aeson 0.10.*`
 
 #### 0.2.0.5
 
diff --git a/include/monad-compat.h b/include/monad-compat.h
new file mode 100644
--- /dev/null
+++ b/include/monad-compat.h
@@ -0,0 +1,5 @@
+#if __GLASGOW_HASKELL__ >= 800
+#define MONAD_ Monad m =>
+#else
+#define MONAD_ (Applicative m, Functor m, Monad m) =>
+#endif
diff --git a/include/overlapping-compat.h b/include/overlapping-compat.h
new file mode 100644
--- /dev/null
+++ b/include/overlapping-compat.h
@@ -0,0 +1,8 @@
+#if __GLASGOW_HASKELL__ >= 710
+#define OVERLAPPABLE_ {-# OVERLAPPABLE #-}
+#define OVERLAPPING_  {-# OVERLAPPING #-}
+#else
+{-# LANGUAGE OverlappingInstances #-}
+#define OVERLAPPABLE_
+#define OVERLAPPING_
+#endif
diff --git a/rest-stringmap.cabal b/rest-stringmap.cabal
--- a/rest-stringmap.cabal
+++ b/rest-stringmap.cabal
@@ -1,5 +1,5 @@
 name:                rest-stringmap
-version:             0.2.0.6
+version:             0.2.0.7
 license:             BSD3
 license-file:        LICENSE
 synopsis:            Maps with stringy keys that can be transcoded to JSON and XML.
@@ -12,6 +12,7 @@
 cabal-version:       >=1.10
 
 extra-source-files:
+  include/*.h
   CHANGELOG.md
   LICENSE
 
@@ -19,6 +20,7 @@
   default-language:  Haskell2010
   ghc-options:       -Wall
   hs-source-dirs:    src
+  include-dirs:      include
   exposed-modules:
     Rest.StringMap.HashMap.Lazy
     Rest.StringMap.HashMap.Strict
@@ -26,8 +28,8 @@
     Rest.StringMap.Map.Strict
     Rest.StringMap.Util
   build-depends:
-      base >= 4.6 && < 4.9
-    , aeson >= 0.7 && < 0.10
+      base >= 4.6 && < 4.12
+    , aeson >= 0.7 && < 1.4
     , containers == 0.5.*
     , hashable == 1.2.*
     , hxt == 9.3.*
diff --git a/src/Rest/StringMap/HashMap/Lazy.hs b/src/Rest/StringMap/HashMap/Lazy.hs
--- a/src/Rest/StringMap/HashMap/Lazy.hs
+++ b/src/Rest/StringMap/HashMap/Lazy.hs
@@ -1,9 +1,12 @@
 {-# LANGUAGE
-    DeriveDataTypeable
+    CPP
+  , DeriveDataTypeable
   , FlexibleInstances
-  , OverlappingInstances
   , ScopedTypeVariables
   #-}
+
+#include "overlapping-compat.h"
+
 module Rest.StringMap.HashMap.Lazy
   ( StringHashMap
   , fromHashMap
@@ -48,7 +51,7 @@
   xpickle = pickleStringMap fromList toList
 
 -- | General case
-instance (Eq a, Hashable a, IsString a, ToString a, XmlPickler b) => XmlPickler (StringHashMap a b) where
+instance OVERLAPPABLE_ (Eq a, Hashable a, IsString a, ToString a, XmlPickler b) => XmlPickler (StringHashMap a b) where
   xpickle = pickleMap mapKeys mapKeys
 
 instance (ToString a, ToJSON b) => ToJSON (StringHashMap a b) where
@@ -59,4 +62,3 @@
 
 instance JSONSchema b => JSONSchema (StringHashMap a b) where
   schema _ = mapSchema (Proxy :: Proxy b)
-
diff --git a/src/Rest/StringMap/HashMap/Strict.hs b/src/Rest/StringMap/HashMap/Strict.hs
--- a/src/Rest/StringMap/HashMap/Strict.hs
+++ b/src/Rest/StringMap/HashMap/Strict.hs
@@ -1,9 +1,12 @@
 {-# LANGUAGE
-    DeriveDataTypeable
+    CPP
+  , DeriveDataTypeable
   , FlexibleInstances
-  , OverlappingInstances
   , ScopedTypeVariables
   #-}
+
+#include "overlapping-compat.h"
+
 module Rest.StringMap.HashMap.Strict
   ( StringHashMap
   , fromHashMap
@@ -48,7 +51,7 @@
   xpickle = pickleStringMap fromList toList
 
 -- | General case
-instance (Eq a, Hashable a, IsString a, ToString a, XmlPickler b) => XmlPickler (StringHashMap a b) where
+instance OVERLAPPABLE_ (Eq a, Hashable a, IsString a, ToString a, XmlPickler b) => XmlPickler (StringHashMap a b) where
   xpickle = pickleMap mapKeys mapKeys
 
 instance (ToString a, ToJSON b) => ToJSON (StringHashMap a b) where
diff --git a/src/Rest/StringMap/Map/Lazy.hs b/src/Rest/StringMap/Map/Lazy.hs
--- a/src/Rest/StringMap/Map/Lazy.hs
+++ b/src/Rest/StringMap/Map/Lazy.hs
@@ -1,9 +1,12 @@
 {-# LANGUAGE
-    DeriveDataTypeable
+    CPP
+  , DeriveDataTypeable
   , FlexibleInstances
-  , OverlappingInstances
   , ScopedTypeVariables
   #-}
+
+#include "overlapping-compat.h"
+
 module Rest.StringMap.Map.Lazy
   ( StringMap
   , fromMap
@@ -44,7 +47,7 @@
 instance XmlPickler b => XmlPickler (StringMap String b) where
   xpickle = pickleStringMap fromList toList
 
-instance (Ord a, IsString a, ToString a, XmlPickler b) => XmlPickler (StringMap a b) where
+instance OVERLAPPABLE_ (Ord a, IsString a, ToString a, XmlPickler b) => XmlPickler (StringMap a b) where
   xpickle = pickleMap mapKeys mapKeys
 
 instance (ToString a, ToJSON b) => ToJSON (StringMap a b) where
diff --git a/src/Rest/StringMap/Map/Strict.hs b/src/Rest/StringMap/Map/Strict.hs
--- a/src/Rest/StringMap/Map/Strict.hs
+++ b/src/Rest/StringMap/Map/Strict.hs
@@ -1,9 +1,12 @@
 {-# LANGUAGE
-    DeriveDataTypeable
+    CPP
+  , DeriveDataTypeable
   , FlexibleInstances
-  , OverlappingInstances
   , ScopedTypeVariables
   #-}
+
+#include "overlapping-compat.h"
+
 module Rest.StringMap.Map.Strict
   ( StringMap
   , fromMap
@@ -44,7 +47,7 @@
 instance XmlPickler b => XmlPickler (StringMap String b) where
   xpickle = pickleStringMap fromList toList
 
-instance (Ord a, IsString a, ToString a, XmlPickler b) => XmlPickler (StringMap a b) where
+instance OVERLAPPABLE_ (Ord a, IsString a, ToString a, XmlPickler b) => XmlPickler (StringMap a b) where
   xpickle = pickleMap mapKeys mapKeys
 
 instance (ToString a, ToJSON b) => ToJSON (StringMap a b) where
