diff --git a/hw-ip.cabal b/hw-ip.cabal
--- a/hw-ip.cabal
+++ b/hw-ip.cabal
@@ -1,6 +1,6 @@
 cabal-version: 1.12
 name: hw-ip
-version: 2.2.0.0
+version: 2.3.0.0
 license: BSD3
 license-file: LICENSE
 copyright: 2018 John Ky, David Turnbull, Jian Wan
diff --git a/src/HaskellWorks/Data/Network/Ip/Ipv4.hs b/src/HaskellWorks/Data/Network/Ip/Ipv4.hs
--- a/src/HaskellWorks/Data/Network/Ip/Ipv4.hs
+++ b/src/HaskellWorks/Data/Network/Ip/Ipv4.hs
@@ -207,3 +207,6 @@
 
 blockToRange :: IpBlock Canonical -> Range IpAddress
 blockToRange b = uncurry Range $ bimap firstIpAddress lastIpAddress (b, b)
+
+instance Contains (IpBlock a) where
+  contains l r = firstIpAddress l <= firstIpAddress r && lastIpAddress l >= lastIpAddress r
diff --git a/src/HaskellWorks/Data/Network/Ip/Ipv6.hs b/src/HaskellWorks/Data/Network/Ip/Ipv6.hs
--- a/src/HaskellWorks/Data/Network/Ip/Ipv6.hs
+++ b/src/HaskellWorks/Data/Network/Ip/Ipv6.hs
@@ -200,3 +200,6 @@
 
 blockToRange :: IpBlock Canonical -> Range IpAddress
 blockToRange b = uncurry Range $ bimap firstIpAddress lastIpAddress (b, b)
+
+instance Contains (IpBlock Canonical) where
+  contains l r = firstIpAddress l <= firstIpAddress r && lastIpAddress l >= lastIpAddress r
diff --git a/src/HaskellWorks/Data/Network/Ip/Range.hs b/src/HaskellWorks/Data/Network/Ip/Range.hs
--- a/src/HaskellWorks/Data/Network/Ip/Range.hs
+++ b/src/HaskellWorks/Data/Network/Ip/Range.hs
@@ -6,6 +6,7 @@
 
 import GHC.Generics
 import HaskellWorks.Data.Network.Ip.SafeEnum
+import Prelude                               hiding (last)
 
 import qualified Text.Appar.String as AP
 
@@ -25,3 +26,10 @@
   where nr = Range f1 (max l1 l2)
 mergeRanges [r] = [r]
 mergeRanges [] = []
+
+class Contains a where
+  -- | 'left' contains 'right', with the possibility of one or both of the boundaries being the same.
+  contains :: a -> a -> Bool
+
+instance Ord a => Contains (Range a) where
+  contains l r = first l <= first r && last l >= last r
