diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,3 @@
+- 0.2.0.0
+    - Use `aeson-1`
+    - removed our `FromJSONKey` and `ToJSONKey` in favour of `aeson` variants
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
 # insert-ordered-containers
 
-Associative containers retating insertion order for traversals.
+Associative containers retaining insertion order for traversals.
diff --git a/insert-ordered-containers.cabal b/insert-ordered-containers.cabal
--- a/insert-ordered-containers.cabal
+++ b/insert-ordered-containers.cabal
@@ -1,9 +1,9 @@
--- This file has been generated from package.yaml by hpack version 0.8.0.
+-- This file has been generated from package.yaml by hpack version 0.14.0.
 --
 -- see: https://github.com/sol/hpack
 
 name:           insert-ordered-containers
-version:        0.1.0.1
+version:        0.2.0.0
 synopsis:       Associative containers retating insertion order for traversals.
 description:    Associative containers retating insertion order for traversals.
 category:       Web
@@ -13,11 +13,12 @@
 maintainer:     Oleg Grenrus <oleg.grenrus@iki.fi>
 license:        BSD3
 license-file:   LICENSE
-tested-with:    GHC==7.8.4, GHC==7.10.3, GHC==8.0.1
+tested-with:    GHC==7.6.3, GHC==7.8.4, GHC==7.10.3, GHC==8.0.1
 build-type:     Simple
 cabal-version:  >= 1.10
 
 extra-source-files:
+    CHANGELOG.md
     README.md
 
 source-repository head
@@ -29,12 +30,12 @@
       src
   ghc-options: -Wall
   build-depends:
-      base                  >=4.7      && <4.10
-    , aeson                 >=0.8.0.2  && <0.12
+      base                  >=4.6      && <4.10
+    , aeson                 >=1.0.0.0  && <1.1
     , base-compat           >=0.6.0    && <0.10
     , hashable              >=1.2.3.3  && <1.4
-    , lens                  >=4.7      && <4.14
-    , semigroupoids         >=4.3      && <5.1
+    , lens                  >=4.7      && <4.15
+    , semigroupoids         >=4.3      && <5.2
     , semigroups            >=0.16.2.2 && <0.19
     , text                  >=1.2.0.6  && <1.3
     , transformers          >=0.3.0.0  && <0.6
@@ -50,12 +51,12 @@
       test
   ghc-options: -Wall
   build-depends:
-      base                  >=4.7      && <4.10
-    , aeson                 >=0.8.0.2  && <0.12
+      base                  >=4.6      && <4.10
+    , aeson                 >=1.0.0.0  && <1.1
     , base-compat           >=0.6.0    && <0.10
     , hashable              >=1.2.3.3  && <1.4
-    , lens                  >=4.7      && <4.14
-    , semigroupoids         >=4.3      && <5.1
+    , lens                  >=4.7      && <4.15
+    , semigroupoids         >=4.3      && <5.2
     , semigroups            >=0.16.2.2 && <0.19
     , text                  >=1.2.0.6  && <1.3
     , transformers          >=0.3.0.0  && <0.6
diff --git a/src/Data/HashMap/Strict/InsOrd.hs b/src/Data/HashMap/Strict/InsOrd.hs
--- a/src/Data/HashMap/Strict/InsOrd.hs
+++ b/src/Data/HashMap/Strict/InsOrd.hs
@@ -62,9 +62,6 @@
     fromList,
     toHashMap,
     fromHashMap,
-    -- * Aeson extras
-    FromJSONKey(..),
-    ToJSONKey(..),
     -- * Lenses
     hashMap,
     unorderedTraversal,
@@ -81,23 +78,19 @@
 
 import           Control.Arrow                   (first, second)
 import           Data.Aeson
-import qualified Data.Aeson.Types                as Aeson
+import qualified Data.Aeson.Encoding             as E
 import           Data.Data                       (Data, Typeable)
 import qualified Data.Foldable                   as F
 import           Data.Functor.Apply              (Apply (..))
 import           Data.Functor.Bind               (Bind (..))
 import           Data.Hashable                   (Hashable (..))
-import           Data.List                       (sortBy, nub)
+import           Data.List                       (nub, sortBy)
 import           Data.Maybe                      (fromMaybe)
 import           Data.Ord                        (comparing)
 import           Data.Semigroup                  (Semigroup (..))
-import           Data.Text                       (Text)
-import qualified Data.Text                       as T
-import qualified GHC.Exts                        as Exts
 import           Text.ParserCombinators.ReadPrec (prec)
 import           Text.Read                       (Lexeme (..), Read (..), lexP,
-                                                  parens, readListPrecDefault,
-                                                  readMaybe)
+                                                  parens, readListPrecDefault)
 
 import Control.Lens                     (At (..), FoldableWithIndex,
                                          FunctorWithIndex, Index, Iso, IxValue,
@@ -108,6 +101,10 @@
 import           Data.HashMap.Strict (HashMap)
 import qualified Data.HashMap.Strict as HashMap
 
+#if MIN_VERSION_base(4,7,0)
+import qualified GHC.Exts as Exts
+#endif
+
 -------------------------------------------------------------------------------
 -- Strict Pair Int a
 -------------------------------------------------------------------------------
@@ -199,78 +196,37 @@
     hashWithSalt salt (InsOrdHashMap _ m) =
         hashWithSalt salt m
 
+#if MIN_VERSION_base(4,7,0)
 instance (Eq k, Hashable k) => Exts.IsList (InsOrdHashMap k v) where
     type Item (InsOrdHashMap k v) = (k, v)
     fromList = fromList
     toList   = toList
+#endif
 
 -------------------------------------------------------------------------------
 -- Aeson
 -------------------------------------------------------------------------------
 
-class ToJSONKey a where
-    toJSONKey :: a -> Text
-    
-    -- | Default implementations picks first element, if exists;
-    -- otherwise evaluates to @""@.
-    toJSONKeyList :: [a] -> Text
-    toJSONKeyList []    = T.empty
-    toJSONKeyList (x:_) = toJSONKey x
-
-instance ToJSONKey Char where
-    toJSONKey c = T.singleton c
-    toJSONKeyList = T.pack
-
-instance ToJSONKey Int where
-    toJSONKey = T.pack . show
-
-instance ToJSONKey a => ToJSONKey [a] where
-    toJSONKey = toJSONKeyList
+instance (ToJSONKey k) => ToJSON1 (InsOrdHashMap k) where
+    liftToJSON t _ = case toJSONKey :: ToJSONKeyFunction k of
+      ToJSONKeyText f _ -> object . fmap (\(k, v) -> (f k, t v)) . toList
+      ToJSONKeyValue f _ -> toJSON . fmap (\(k,v) -> toJSON (f k, t v)) . toList
 
-instance ToJSONKey Text where
-    toJSONKey = id
+    liftToEncoding t _ = case toJSONKey :: ToJSONKeyFunction k of
+      ToJSONKeyText _ f ->  E.dict f t foldrWithKey
+      ToJSONKeyValue _ f -> E.list (liftToEncoding2 f (E.list f) t (E.list t)) . toList
 
 instance (ToJSONKey k, ToJSON v) => ToJSON (InsOrdHashMap k v) where
-    toJSON = object . fmap f . toList
-      where
-        f (k, v) = toJSONKey k .= v
-
-#if MIN_VERSION_aeson(0,10,0)
-    toEncoding = pairs . mconcat . fmap f . toList
-      where
-        f (k, v) = toJSONKey k .= v
-#endif
+    toJSON = toJSON1
+    toEncoding = toEncoding1
 
 -------------------------------------------------------------------------------
 
--- | See https://github.com/bos/aeson/pull/341
-class FromJSONKey a where
-    parseJSONKey :: Text -> Aeson.Parser a
-
-    -- | Default implementation parses into singleton list. 'String' @:(@
-    parseJSONKeyList :: Text -> Aeson.Parser [a]
-    parseJSONKeyList t = (:[]) <$> parseJSONKey t
-
-instance FromJSONKey Char where
-    parseJSONKey t = case T.uncons t of
-      Just (c, r) | T.null r -> pure c
-      _                      -> fail $ "Non-singleton json key for Char: " ++ T.unpack t
-    parseJSONKeyList = pure . T.unpack
-
-instance FromJSONKey Int where
-    parseJSONKey t = maybe (fail "Cannot parse Int key") return $
-        readMaybe $ T.unpack t
-
-instance FromJSONKey a => FromJSONKey [a] where
-    parseJSONKey = parseJSONKeyList
-
-instance FromJSONKey Text where
-    parseJSONKey = pure
+instance (Eq k, Hashable k, FromJSONKey k) => FromJSON1 (InsOrdHashMap k) where
+    liftParseJSON p pl v = fromList . HashMap.toList <$> liftParseJSON p pl v
 
 instance (Eq k, Hashable k, FromJSONKey k, FromJSON v) => FromJSON (InsOrdHashMap k v) where
-    parseJSON = withObject "OrdHasMap k v" $ \obj ->
-        fmap fromList $ traverse f $ HashMap.toList obj
-      where f (k, v) = (,) <$> parseJSONKey k <*> parseJSON v
+    parseJSON = parseJSON1
 
 -------------------------------------------------------------------------------
 -- Lens
