diff --git a/Data/Aeson/IP.hs b/Data/Aeson/IP.hs
--- a/Data/Aeson/IP.hs
+++ b/Data/Aeson/IP.hs
@@ -19,34 +19,61 @@
         | otherwise = fail "Unable to parse"
     parseJSON v = typeMismatch "IPv4" v
 
+instance FromJSONKey IPv4 where
+    fromJSONKey = FromJSONKeyTextParser $ \t ->
+                      case readMaybe (Text.unpack t) of
+                          Just r -> pure r
+                          Nothing -> fail "Unable to parse IPv4"
+
 instance ToJSON IPv4 where
     toJSON = String . Text.pack . show
 
+instance ToJSONKey IPv4 where
+    toJSONKey = toJSONKeyText (Text.pack . show)
+
 instance FromJSON IPv6 where
     parseJSON (String s)
         | Just r <- readMaybe (Text.unpack s) = pure r
         | otherwise = fail "Unable to parse"
     parseJSON v = typeMismatch "IPv6" v
 
+instance FromJSONKey IPv6 where
+    fromJSONKey = FromJSONKeyTextParser $ \t ->
+                      case readMaybe (Text.unpack t) of
+                          Just r -> pure r
+                          Nothing -> fail "Unable to parse IPv6"
+
 instance ToJSON IPv6 where
     toJSON = String . Text.pack . show
 
+instance ToJSONKey IPv6 where
+    toJSONKey = toJSONKeyText (Text.pack . show)
+
 instance FromJSON IP where
     parseJSON (String s)
         | Just r <- readMaybe (Text.unpack s) = pure r
         | otherwise = fail "Unable to parse"
     parseJSON v = typeMismatch "IP" v
 
+instance FromJSONKey IP where
+    fromJSONKey = FromJSONKeyTextParser $ \t ->
+                      case readMaybe (Text.unpack t) of
+                          Just r -> pure r
+                          Nothing -> fail "Unable to parse IP"
+
 instance ToJSON IP where
     toJSON = String . Text.pack . show
 
+instance ToJSONKey IP where
+    toJSONKey = toJSONKeyText (Text.pack . show)
+
 instance Read (AddrRange a) => FromJSON (AddrRange a) where
     parseJSON (String s)
         | Just r <- readMaybe (Text.unpack s) = pure r
         | otherwise = fail "Unable to parse"
     parseJSON v = typeMismatch "AddrRange" v
 
-instance Show (AddrRange a) => ToJSON (AddrRange a) where
+instance Show a => ToJSON (AddrRange a) where
     toJSON = String . Text.pack . show
 
 instance FromJSON IPRange where
@@ -58,3 +85,20 @@
 instance ToJSON IPRange where
     toJSON = String . Text.pack . show
 
+instance Read (AddrRange a) => FromJSONKey (AddrRange a) where
+    fromJSONKey = FromJSONKeyTextParser $ \t ->
+                      case readMaybe (Text.unpack t) of
+                          Just r -> pure r
+                          Nothing -> fail "Unable to parse AddrRange"
+
+instance Show a => ToJSONKey (AddrRange a) where
+    toJSONKey = toJSONKeyText (Text.pack . show)
+
+instance FromJSONKey IPRange where
+    fromJSONKey = FromJSONKeyTextParser $ \t ->
+                      case readMaybe (Text.unpack t) of
+                          Just r -> pure r
+                          Nothing -> fail "Unable to parse IPRange"
+
+instance ToJSONKey IPRange where
+    toJSONKey = toJSONKeyText (Text.pack . show)
diff --git a/aeson-iproute.cabal b/aeson-iproute.cabal
--- a/aeson-iproute.cabal
+++ b/aeson-iproute.cabal
@@ -2,8 +2,9 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                aeson-iproute
-version:             0.1.1
+version:             0.1.2
 synopsis:            Aeson instances for iproute types
+description:         Aeson instances for iproute types.
 license:             BSD3
 license-file:        LICENSE
 author:              Lana Black
@@ -12,6 +13,7 @@
 category:            Data
 build-type:          Simple
 cabal-version:       >=1.10
+Tested-With: GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2
 
 library
   exposed-modules:     Data.Aeson.IP
@@ -23,3 +25,7 @@
                         
   default-language:    Haskell2010
   ghc-options:         -Wall -fno-warn-orphans
+
+source-repository head
+  type: git
+  location: https://github.com/greydot/aeson-iproute.git
