diff --git a/Data/IP/Addr.hs b/Data/IP/Addr.hs
--- a/Data/IP/Addr.hs
+++ b/Data/IP/Addr.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 module Data.IP.Addr where
 
 import Control.Monad
@@ -10,6 +11,9 @@
 import System.ByteOrder
 import Text.Appar.String
 import Text.Printf
+#ifdef GENERICS
+import GHC.Generics
+#endif
 
 ----------------------------------------------------------------
 
@@ -25,7 +29,11 @@
 
 data IP = IPv4 { ipv4 :: IPv4 }
         | IPv6 { ipv6 :: IPv6 }
+#ifdef GENERICS
+        deriving (Eq, Ord, Generic)
+#else
         deriving (Eq, Ord)
+#endif
 
 instance Show IP where
     show (IPv4 ip) = show ip
@@ -44,7 +52,12 @@
 >>> read "192.0.2.1" :: IPv4
 192.0.2.1
 -}
-newtype IPv4 = IP4 IPv4Addr deriving (Eq, Ord)
+newtype IPv4 = IP4 IPv4Addr
+#ifdef GENERICS
+  deriving (Eq, Ord,Generic)
+#else
+  deriving (Eq, Ord)
+#endif
 
 {-|
   The abstract data type to express an IPv6 address.
@@ -59,7 +72,12 @@
 >>> read "2001:db8::192.0.2.1" :: IPv6
 2001:db8:00:00:00:00:c000:201
 -}
-newtype IPv6 = IP6 IPv6Addr deriving (Eq, Ord)
+newtype IPv6 = IP6 IPv6Addr
+#ifdef GENERICS
+  deriving (Eq, Ord,Generic)
+#else
+  deriving (Eq, Ord)
+#endif
 
 ----------------------------------------------------------------
 --
diff --git a/Data/IP/Range.hs b/Data/IP/Range.hs
--- a/Data/IP/Range.hs
+++ b/Data/IP/Range.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE CPP #-}
 module Data.IP.Range where
 
 import Control.Monad
@@ -7,6 +8,9 @@
 import Data.IP.Mask
 import Data.String
 import Text.Appar.String
+#ifdef GENERICS
+import GHC.Generics
+#endif
 
 ----------------------------------------------------------------
 
@@ -23,7 +27,11 @@
 
 data IPRange = IPv4Range { ipv4range :: AddrRange IPv4 }
              | IPv6Range { ipv6range :: AddrRange IPv6 }
-             deriving (Eq)
+#ifdef GENERICS
+        deriving (Eq, Generic)
+#else
+        deriving (Eq)
+#endif
 
 ----------------------------------------------------------------
 --
@@ -51,7 +59,12 @@
       , mask :: !a
         -- |The 'mlen' function returns a mask length from 'AddrRange'.
       , mlen :: {-# UNPACK #-} !Int
-    } deriving (Eq, Ord)
+    }
+#ifdef GENERICS
+    deriving (Eq, Ord, Generic)
+#else
+    deriving (Eq, Ord)
+#endif
 
 ----------------------------------------------------------------
 --
diff --git a/iproute.cabal b/iproute.cabal
--- a/iproute.cabal
+++ b/iproute.cabal
@@ -1,5 +1,5 @@
 Name:                   iproute
-Version:                1.2.12
+Version:                1.3.0
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
@@ -30,6 +30,13 @@
                       , byteorder
                       , containers
                       , network
+
+
+  if impl(ghc >= 7.2.1)
+    cpp-options:        -DGENERICS
+    default-extensions: DeriveGeneric
+  if impl(ghc >= 7.2.1) && impl(ghc < 7.6.1)
+    build-depends:      ghc-prim >= 0.2
 
 Test-Suite doctest
   Type:                 exitcode-stdio-1.0
