diff --git a/hw-ip.cabal b/hw-ip.cabal
--- a/hw-ip.cabal
+++ b/hw-ip.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.2
 name: hw-ip
-version: 2.3.4.0
+version: 2.3.4.1
 license: BSD-3-Clause
 license-file: LICENSE
 copyright: 2018-2019 John Ky, David Turnbull, Jian Wan
diff --git a/src/HaskellWorks/Data/Network/Ip/Ip.hs b/src/HaskellWorks/Data/Network/Ip/Ip.hs
--- a/src/HaskellWorks/Data/Network/Ip/Ip.hs
+++ b/src/HaskellWorks/Data/Network/Ip/Ip.hs
@@ -21,6 +21,7 @@
 import GHC.Generics
 import HaskellWorks.Data.Bits.BitWise
 import HaskellWorks.Data.Network.Ip.Range    (Range (..))
+import HaskellWorks.Data.Network.Ip.SafeEnum
 import HaskellWorks.Data.Network.Ip.Validity
 import Text.Read
 
@@ -59,6 +60,13 @@
         case readMaybe s :: Maybe V6.IpAddress of
           Just ip -> [(IpAddressV6 ip, "")]
           Nothing -> []
+
+instance SafeEnum IpAddress where
+  safePred (IpAddressV4 ip) = IpAddressV4 <$> safePred ip
+  safePred (IpAddressV6 ip) = IpAddressV6 <$> safePred ip
+
+  safeSucc (IpAddressV4 ip) = IpAddressV4 <$> safeSucc ip
+  safeSucc (IpAddressV6 ip) = IpAddressV6 <$> safeSucc ip
 
 isCanonical :: IpBlock v -> Bool
 isCanonical (IpBlockV4 b) = V4.isCanonical b
