diff --git a/Data/Conduit/Network/Utils.hs b/Data/Conduit/Network/Utils.hs
--- a/Data/Conduit/Network/Utils.hs
+++ b/Data/Conduit/Network/Utils.hs
@@ -32,11 +32,17 @@
 --
 -- * @*4@ means @HostIPv4@
 --
+-- * @!4@ means @HostIPv4Only@
+--
 -- * @*6@ means @HostIPv6@
+--
+-- * @!6@ means @HostIPv6Only@
 data HostPreference =
     HostAny
   | HostIPv4
+  | HostIPv4Only
   | HostIPv6
+  | HostIPv6Only
   | Host String
     deriving (Eq, Ord, Show, Read)
 
@@ -46,7 +52,9 @@
     {-
     fromString "*" = HostAny
     fromString "*4" = HostIPv4
+    fromString "!4" = HostIPv4Only
     fromString "*6" = HostIPv6
+    fromString "!6" = HostIPv6Only
     -}
     fromString s'@('*':s) =
         case s of
@@ -54,6 +62,11 @@
             ['4'] -> HostIPv4
             ['6'] -> HostIPv6
             _ -> Host s'
+    fromString s'@('!':s) =
+        case s of
+            ['4'] -> HostIPv4Only
+            ['6'] -> HostIPv6Only
+            _ -> Host s'
     fromString s = Host s
 
 -- | Attempt to bind a listening @Socket@ on the given host/port using given
@@ -79,8 +92,10 @@
         addrs6 = filter (\x -> NS.addrFamily x == NS.AF_INET6) addrs
         addrs' =
             case s of
-                HostIPv4 -> addrs4 ++ addrs6
-                HostIPv6 -> addrs6 ++ addrs4
+                HostIPv4     -> addrs4 ++ addrs6
+                HostIPv4Only -> addrs4
+                HostIPv6     -> addrs6 ++ addrs4
+                HostIPv6Only -> addrs6
                 _ -> addrs
 
         tryAddrs (addr1:rest@(_:_)) =
diff --git a/network-conduit.cabal b/network-conduit.cabal
--- a/network-conduit.cabal
+++ b/network-conduit.cabal
@@ -1,5 +1,5 @@
 Name:                network-conduit
-Version:             1.0.3
+Version:             1.0.4
 Synopsis:            Stream socket data using conduits.
 Description:         Stream socket data using conduits.
 License:             BSD3
