diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,12 @@
+## Version 3.1.4.0
+
+* Install and use afunix_compat.h header.
+  [#556](https://github.com/haskell/network/pull/556)
+* Supporting SO_SNDTIMEO and SO_RCVTIMEO.
+  [#555](https://github.com/haskell/network/pull/555)
+* Emulating socketPair on Windows.
+  [#554](https://github.com/haskell/network/pull/554)
+
 ## Version 3.1.3.0
 
 * Supporting AF_UNIX on Windows
diff --git a/Network/Socket.hs b/Network/Socket.hs
--- a/Network/Socket.hs
+++ b/Network/Socket.hs
@@ -143,6 +143,7 @@
                   ,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo
                   ,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo)
     , StructLinger (..)
+    , SocketTimeout (..)
     , isSupportedSocketOption
     , whenSupported
     , getSocketOption
diff --git a/Network/Socket/ByteString/IO.hsc b/Network/Socket/ByteString/IO.hsc
--- a/Network/Socket/ByteString/IO.hsc
+++ b/Network/Socket/ByteString/IO.hsc
@@ -232,6 +232,11 @@
 --
 -- For TCP sockets, a zero length return value means the peer has
 -- closed its half side of the connection.
+--
+-- Currently, the 'recv' family is blocked on Windows because a proper
+-- IO manager is not implemented. To use with 'System.Timeout.timeout'
+-- on Windows, use 'Network.Socket.setSocketOption' with
+-- 'Network.Socket.RecvTimeOut' as well.
 recv :: Socket        -- ^ Connected socket
      -> Int            -- ^ Maximum number of bytes to receive
      -> IO ByteString  -- ^ Data received
diff --git a/Network/Socket/Info.hsc b/Network/Socket/Info.hsc
--- a/Network/Socket/Info.hsc
+++ b/Network/Socket/Info.hsc
@@ -413,11 +413,7 @@
 -- SockAddr
 
 instance Show SockAddr where
-#if defined(DOMAIN_SOCKET_SUPPORT)
   showsPrec _ (SockAddrUnix str) = showString str
-#else
-  showsPrec _ SockAddrUnix{} = error "showsPrec: not supported"
-#endif
   showsPrec _ (SockAddrInet port ha)
    = showHostAddress ha
    . showString ":"
diff --git a/Network/Socket/Options.hsc b/Network/Socket/Options.hsc
--- a/Network/Socket/Options.hsc
+++ b/Network/Socket/Options.hsc
@@ -26,6 +26,7 @@
   , getSockOpt
   , setSockOpt
   , StructLinger (..)
+  , SocketTimeout (..)
   ) where
 
 import qualified Text.Read as P
@@ -38,7 +39,9 @@
 import Network.Socket.Types
 import Network.Socket.ReadShow
 
------------------------------------------------------------------------------
+#include <sys/time.h>
+
+----------------------------------------------------------------
 -- Socket Properties
 
 -- | Socket options for use with 'setSocketOption' and 'getSocketOption'.
@@ -55,18 +58,75 @@
 #endif
   deriving (Eq)
 
+----------------------------------------------------------------
+
+socketOptionBijection :: Bijection SocketOption String
+socketOptionBijection =
+    [ (UnsupportedSocketOption, "UnsupportedSocketOption")
+    , (Debug, "Debug")
+    , (ReuseAddr, "ReuseAddr")
+    , (SoDomain, "SoDomain")
+    , (Type, "Type")
+    , (SoProtocol, "SoProtocol")
+    , (SoError, "SoError")
+    , (DontRoute, "DontRoute")
+    , (Broadcast, "Broadcast")
+    , (SendBuffer, "SendBuffer")
+    , (RecvBuffer, "RecvBuffer")
+    , (KeepAlive, "KeepAlive")
+    , (OOBInline, "OOBInline")
+    , (Linger, "Linger")
+    , (ReusePort, "ReusePort")
+    , (RecvLowWater, "RecvLowWater")
+    , (SendLowWater, "SendLowWater")
+    , (RecvTimeOut, "RecvTimeOut")
+    , (SendTimeOut, "SendTimeOut")
+    , (UseLoopBack, "UseLoopBack")
+    , (MaxSegment, "MaxSegment")
+    , (NoDelay, "NoDelay")
+    , (UserTimeout, "UserTimeout")
+    , (Cork, "Cork")
+    , (TimeToLive, "TimeToLive")
+    , (RecvIPv4TTL, "RecvIPv4TTL")
+    , (RecvIPv4TOS, "RecvIPv4TOS")
+    , (RecvIPv4PktInfo, "RecvIPv4PktInfo")
+    , (IPv6Only, "IPv6Only")
+    , (RecvIPv6HopLimit, "RecvIPv6HopLimit")
+    , (RecvIPv6TClass, "RecvIPv6TClass")
+    , (RecvIPv6PktInfo, "RecvIPv6PktInfo")
+    ]
+
+instance Show SocketOption where
+    showsPrec = bijectiveShow socketOptionBijection def
+      where
+        defname = "SockOpt"
+        unwrap = \(CustomSockOpt nm) -> nm
+        def = defShow defname unwrap showIntInt
+
+
+instance Read SocketOption where
+    readPrec = bijectiveRead socketOptionBijection def
+      where
+        defname = "SockOpt"
+        def = defRead defname CustomSockOpt readIntInt
+
+----------------------------------------------------------------
+
+pattern UnsupportedSocketOption :: SocketOption
+pattern UnsupportedSocketOption = SockOpt (-1) (-1)
+
 -- | Does the 'SocketOption' exist on this system?
 isSupportedSocketOption :: SocketOption -> Bool
 isSupportedSocketOption opt = opt /= SockOpt (-1) (-1)
 
--- | Get the 'SocketType' of an active socket.
---
---   Since: 3.0.1.0
-getSocketType :: Socket -> IO SocketType
-getSocketType s = unpackSocketType <$> getSockOpt s Type
+-- | Execute the given action only when the specified socket option is
+--  supported. Any return value is ignored.
+whenSupported :: SocketOption -> IO a -> IO ()
+whenSupported s action
+  | isSupportedSocketOption s = action >> return ()
+  | otherwise                 = return ()
 
-pattern UnsupportedSocketOption :: SocketOption
-pattern UnsupportedSocketOption = SockOpt (-1) (-1)
+----------------------------------------------------------------
 
 #ifdef SOL_SOCKET
 -- | SO_ACCEPTCONN, read-only
@@ -192,14 +252,14 @@
 #else
 pattern SendLowWater   = SockOpt (-1) (-1)
 #endif
--- | SO_RCVTIMEO: this does not work at this moment.
+-- | SO_RCVTIMEO: timeout in microseconds
 pattern RecvTimeOut :: SocketOption
 #ifdef SO_RCVTIMEO
 pattern RecvTimeOut    = SockOpt (#const SOL_SOCKET) (#const SO_RCVTIMEO)
 #else
 pattern RecvTimeOut    = SockOpt (-1) (-1)
 #endif
--- | SO_SNDTIMEO: this does not work at this moment.
+-- | SO_SNDTIMEO: timeout in microseconds
 pattern SendTimeOut :: SocketOption
 #ifdef SO_SNDTIMEO
 pattern SendTimeOut    = SockOpt (#const SOL_SOCKET) (#const SO_SNDTIMEO)
@@ -317,41 +377,7 @@
   where
     CustomSockOpt (x, y) = SockOpt x y
 
-#if __GLASGOW_HASKELL__ >= 806
-{-# COMPLETE CustomSockOpt #-}
-#endif
-#ifdef SO_LINGER
--- | Low level 'SO_LINBER' option value, which can be used with 'setSockOpt'.
---
-data StructLinger = StructLinger {
-    -- | Set the linger option on.
-    sl_onoff  :: CInt,
-
-    -- | Linger timeout.
-    sl_linger :: CInt
-  }
-  deriving (Eq, Ord, Show)
-
-instance Storable StructLinger where
-    sizeOf    _ = (#const sizeof(struct linger))
-    alignment _ = alignment (0 :: CInt)
-
-    peek p = do
-        onoff  <- (#peek struct linger, l_onoff) p
-        linger <- (#peek struct linger, l_linger) p
-        return $ StructLinger onoff linger
-
-    poke p (StructLinger onoff linger) = do
-        (#poke struct linger, l_onoff)  p onoff
-        (#poke struct linger, l_linger) p linger
-#endif
-
--- | Execute the given action only when the specified socket option is
---  supported. Any return value is ignored.
-whenSupported :: SocketOption -> IO a -> IO ()
-whenSupported s action
-  | isSupportedSocketOption s = action >> return ()
-  | otherwise                 = return ()
+----------------------------------------------------------------
 
 -- | Set a socket option that expects an 'Int' value.
 setSocketOption :: Socket
@@ -363,6 +389,8 @@
     let arg = if v == 0 then StructLinger 0 0 else StructLinger 1 (fromIntegral v)
     setSockOpt s so arg
 #endif
+setSocketOption s so@RecvTimeOut v = setSockOpt s so $ SocketTimeout $ fromIntegral v
+setSocketOption s so@SendTimeOut v = setSockOpt s so $ SocketTimeout $ fromIntegral v
 setSocketOption s sa v = setSockOpt s sa (fromIntegral v :: CInt)
 
 -- | Set a socket option.
@@ -378,6 +406,8 @@
           throwSocketErrorIfMinus1_ "Network.Socket.setSockOpt" $
           c_setsockopt fd level opt ptr sz
 
+----------------------------------------------------------------
+
 -- | Get a socket option that gives an 'Int' value.
 getSocketOption :: Socket
                 -> SocketOption  -- Option Name
@@ -387,6 +417,12 @@
     StructLinger onoff linger <- getSockOpt s so
     return $ fromIntegral $ if onoff == 0 then 0 else linger
 #endif
+getSocketOption s so@RecvTimeOut = do
+    SocketTimeout to <- getSockOpt s so
+    return $ fromIntegral to
+getSocketOption s so@SendTimeOut = do
+    SocketTimeout to <- getSockOpt s so
+    return $ fromIntegral to
 getSocketOption s so = do
     n :: CInt <- getSockOpt s so
     return $ fromIntegral n
@@ -404,56 +440,75 @@
                 c_getsockopt fd level opt ptr ptr_sz
         peek ptr
 
+----------------------------------------------------------------
 
-socketOptionBijection :: Bijection SocketOption String
-socketOptionBijection =
-    [ (UnsupportedSocketOption, "UnsupportedSocketOption")
-    , (Debug, "Debug")
-    , (ReuseAddr, "ReuseAddr")
-    , (SoDomain, "SoDomain")
-    , (Type, "Type")
-    , (SoProtocol, "SoProtocol")
-    , (SoError, "SoError")
-    , (DontRoute, "DontRoute")
-    , (Broadcast, "Broadcast")
-    , (SendBuffer, "SendBuffer")
-    , (RecvBuffer, "RecvBuffer")
-    , (KeepAlive, "KeepAlive")
-    , (OOBInline, "OOBInline")
-    , (Linger, "Linger")
-    , (ReusePort, "ReusePort")
-    , (RecvLowWater, "RecvLowWater")
-    , (SendLowWater, "SendLowWater")
-    , (RecvTimeOut, "RecvTimeOut")
-    , (SendTimeOut, "SendTimeOut")
-    , (UseLoopBack, "UseLoopBack")
-    , (MaxSegment, "MaxSegment")
-    , (NoDelay, "NoDelay")
-    , (UserTimeout, "UserTimeout")
-    , (Cork, "Cork")
-    , (TimeToLive, "TimeToLive")
-    , (RecvIPv4TTL, "RecvIPv4TTL")
-    , (RecvIPv4TOS, "RecvIPv4TOS")
-    , (RecvIPv4PktInfo, "RecvIPv4PktInfo")
-    , (IPv6Only, "IPv6Only")
-    , (RecvIPv6HopLimit, "RecvIPv6HopLimit")
-    , (RecvIPv6TClass, "RecvIPv6TClass")
-    , (RecvIPv6PktInfo, "RecvIPv6PktInfo")
-    ]
+-- | Get the 'SocketType' of an active socket.
+--
+--   Since: 3.0.1.0
+getSocketType :: Socket -> IO SocketType
+getSocketType s = unpackSocketType <$> getSockOpt s Type
 
-instance Show SocketOption where
-    showsPrec = bijectiveShow socketOptionBijection def
-      where
-        defname = "SockOpt"
-        unwrap = \(CustomSockOpt nm) -> nm
-        def = defShow defname unwrap showIntInt
+----------------------------------------------------------------
 
+#if __GLASGOW_HASKELL__ >= 806
+{-# COMPLETE CustomSockOpt #-}
+#endif
+#ifdef SO_LINGER
+-- | Low level 'SO_LINBER' option value, which can be used with 'setSockOpt'.
+--
+data StructLinger = StructLinger {
+    -- | Set the linger option on.
+    sl_onoff  :: CInt,
 
-instance Read SocketOption where
-    readPrec = bijectiveRead socketOptionBijection def
-      where
-        defname = "SockOpt"
-        def = defRead defname CustomSockOpt readIntInt
+    -- | Linger timeout.
+    sl_linger :: CInt
+  }
+  deriving (Eq, Ord, Show)
+
+instance Storable StructLinger where
+    sizeOf    _ = (#const sizeof(struct linger))
+    alignment _ = alignment (0 :: CInt)
+
+    peek p = do
+        onoff  <- (#peek struct linger, l_onoff) p
+        linger <- (#peek struct linger, l_linger) p
+        return $ StructLinger onoff linger
+
+    poke p (StructLinger onoff linger) = do
+        (#poke struct linger, l_onoff)  p onoff
+        (#poke struct linger, l_linger) p linger
+#endif
+
+----------------------------------------------------------------
+
+-- | Timeout in microseconds.
+--   This will be converted into struct timeval on Unix and
+--   DWORD (as milliseconds) on Windows.
+newtype SocketTimeout = SocketTimeout Word32 deriving (Eq, Ord, Show)
+
+#if defined(mingw32_HOST_OS)
+instance Storable SocketTimeout where
+    sizeOf (SocketTimeout to) = sizeOf to -- DWORD as milliseconds
+    alignment _ = 0
+    peek ptr    = do
+        to <- peek (castPtr ptr)
+        return $ SocketTimeout (to * 1000)
+    poke ptr (SocketTimeout to) = poke (castPtr ptr) (to `div` 1000)
+#else
+instance Storable SocketTimeout where
+    sizeOf _    = (#size struct timeval)
+    alignment _ = (#const offsetof(struct {char x__; struct timeval (y__); }, y__))
+    peek ptr    = do
+            sec  <- (#peek struct timeval, tv_sec)  ptr
+            usec <- (#peek struct timeval, tv_usec) ptr
+            return $ SocketTimeout (sec * 1000000 + usec)
+    poke ptr (SocketTimeout to) = do
+            let (sec, usec) = to `divMod` 1000000
+            (#poke struct timeval, tv_sec)  ptr sec
+            (#poke struct timeval, tv_usec) ptr usec
+#endif
+
+----------------------------------------------------------------
 
 foreign import CALLCONV unsafe "getsockopt"
   c_getsockopt :: CInt -> CInt -> CInt -> Ptr a -> Ptr CInt -> IO CInt
diff --git a/Network/Socket/Types.hsc b/Network/Socket/Types.hsc
--- a/Network/Socket/Types.hsc
+++ b/Network/Socket/Types.hsc
@@ -93,9 +93,7 @@
 
 import qualified Text.Read as P
 
-#if defined(DOMAIN_SOCKET_SUPPORT)
 import Foreign.Marshal.Array
-#endif
 
 import Network.Socket.Imports
 
@@ -1075,11 +1073,7 @@
 isSupportedSockAddr addr = case addr of
   SockAddrInet{}  -> True
   SockAddrInet6{} -> True
-#if defined(DOMAIN_SOCKET_SUPPORT)
   SockAddrUnix{}  -> True
-#else
-  SockAddrUnix{}  -> False
-#endif
 
 instance SocketAddress SockAddr where
     sizeOfSocketAddress = sizeOfSockAddr
@@ -1098,7 +1092,6 @@
 -- 'SockAddr'.  This function differs from 'Foreign.Storable.sizeOf'
 -- in that the value of the argument /is/ used.
 sizeOfSockAddr :: SockAddr -> Int
-#if defined(DOMAIN_SOCKET_SUPPORT)
 # ifdef linux_HOST_OS
 -- http://man7.org/linux/man-pages/man7/unix.7.html says:
 -- "an abstract socket address is distinguished (from a
@@ -1118,9 +1111,6 @@
 # else
 sizeOfSockAddr SockAddrUnix{}  = #const sizeof(struct sockaddr_un)
 # endif
-#else
-sizeOfSockAddr SockAddrUnix{}  = error "sizeOfSockAddr: not supported"
-#endif
 sizeOfSockAddr SockAddrInet{}  = #const sizeof(struct sockaddr_in)
 sizeOfSockAddr SockAddrInet6{} = #const sizeof(struct sockaddr_in6)
 
@@ -1135,10 +1125,8 @@
 -- structure, and attempting to do so could overflow the allocated storage
 -- space.  This constant holds the maximum allowable path length.
 --
-#if defined(DOMAIN_SOCKET_SUPPORT)
 unixPathMax :: Int
 unixPathMax = #const sizeof(((struct sockaddr_un *)NULL)->sun_path)
-#endif
 
 -- We can't write an instance of 'Storable' for 'SockAddr' because
 -- @sockaddr@ is a sum type of variable size but
@@ -1149,7 +1137,6 @@
 
 -- | Write the given 'SockAddr' to the given memory location.
 pokeSockAddr :: Ptr a -> SockAddr -> IO ()
-#if defined(DOMAIN_SOCKET_SUPPORT)
 pokeSockAddr p sa@(SockAddrUnix path) = do
     when (length path > unixPathMax) $ error
       $ "pokeSockAddr: path is too long in SockAddrUnix " <> show path
@@ -1162,9 +1149,6 @@
     let pathC = map castCharToCChar path
     -- the buffer is already filled with nulls.
     pokeArray ((#ptr struct sockaddr_un, sun_path) p) pathC
-#else
-pokeSockAddr _ SockAddrUnix{} = error "pokeSockAddr: not supported"
-#endif
 pokeSockAddr p (SockAddrInet port addr) = do
     zeroMemory p (#const sizeof(struct sockaddr_in))
 #if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)
@@ -1189,11 +1173,9 @@
 peekSockAddr p = do
   family <- (#peek struct sockaddr, sa_family) p
   case family :: CSaFamily of
-#if defined(DOMAIN_SOCKET_SUPPORT)
     (#const AF_UNIX) -> do
         str <- peekCAString ((#ptr struct sockaddr_un, sun_path) p)
         return (SockAddrUnix str)
-#endif
     (#const AF_INET) -> do
         addr <- (#peek struct sockaddr_in, sin_addr) p
         port <- (#peek struct sockaddr_in, sin_port) p
diff --git a/Network/Socket/Unix.hsc b/Network/Socket/Unix.hsc
--- a/Network/Socket/Unix.hsc
+++ b/Network/Socket/Unix.hsc
@@ -1,4 +1,5 @@
 {-# LANGUAGE CPP #-}
+{-# LANGUAGE ScopedTypeVariables #-}
 
 #include "HsNet.h"
 ##include "HsNetDef.h"
@@ -13,16 +14,24 @@
   , getPeerEid
   ) where
 
-import System.Posix.Types (Fd(..))
-
+import Foreign.Marshal.Alloc (allocaBytes)
 import Network.Socket.Buffer
+import Network.Socket.Fcntl
 import Network.Socket.Imports
+import Network.Socket.Types
+import System.Posix.Types (Fd(..))
+
 #if defined(mingw32_HOST_OS)
+import Network.Socket.Syscall
 import Network.Socket.Win32.Cmsg
+import System.Directory
+import System.IO
+import System.IO.Temp
 #else
+import Foreign.Marshal.Array (peekArray)
+import Network.Socket.Internal
 import Network.Socket.Posix.Cmsg
 #endif
-import Network.Socket.Types
 
 #if defined(HAVE_GETPEEREID)
 import System.IO.Error (catchIOError)
@@ -30,13 +39,7 @@
 #ifdef HAVE_GETPEEREID
 import Foreign.Marshal.Alloc (alloca)
 #endif
-#ifdef DOMAIN_SOCKET_SUPPORT
-import Foreign.Marshal.Alloc (allocaBytes)
-import Foreign.Marshal.Array (peekArray)
 
-import Network.Socket.Fcntl
-import Network.Socket.Internal
-#endif
 #ifdef HAVE_STRUCT_UCRED_SO_PEERCRED
 import Network.Socket.Options
 #endif
@@ -123,14 +126,12 @@
 {-# Deprecated getPeerEid "Use getPeerCredential instead" #-}
 
 -- | Whether or not UNIX-domain sockets are available.
+--   'AF_UNIX' is supported on Windows since 3.1.3.0.
+--   So, this variable is 'True` on all platforms.
 --
 --   Since 2.7.0.0.
 isUnixDomainSocketAvailable :: Bool
-#if defined(DOMAIN_SOCKET_SUPPORT)
 isUnixDomainSocketAvailable = True
-#else
-isUnixDomainSocketAvailable = False
-#endif
 
 data NullSockAddr = NullSockAddr
 
@@ -140,26 +141,19 @@
     pokeSocketAddress _ _ = return ()
 
 -- | Send a file descriptor over a UNIX-domain socket.
---   Use this function in the case where 'isUnixDomainSocketAvailable' is
---  'True'.
+--   This function does not work on Windows.
 sendFd :: Socket -> CInt -> IO ()
-#if defined(DOMAIN_SOCKET_SUPPORT)
 sendFd s outfd = void $ allocaBytes dummyBufSize $ \buf -> do
     let cmsg = encodeCmsg $ Fd outfd
     sendBufMsg s NullSockAddr [(buf,dummyBufSize)] [cmsg] mempty
   where
     dummyBufSize = 1
-#else
-sendFd _ _ = error "Network.Socket.sendFd"
-#endif
 
 -- | Receive a file descriptor over a UNIX-domain socket. Note that the resulting
 --   file descriptor may have to be put into non-blocking mode in order to be
 --   used safely. See 'setNonBlockIfNeeded'.
---   Use this function in the case where 'isUnixDomainSocketAvailable' is
---  'True'.
+--   This function does not work on Windows.
 recvFd :: Socket -> IO CInt
-#if defined(DOMAIN_SOCKET_SUPPORT)
 recvFd s = allocaBytes dummyBufSize $ \buf -> do
     (NullSockAddr, _, cmsgs, _) <- recvBufMsg s [(buf,dummyBufSize)] 32 mempty
     case (lookupCmsg CmsgIdFd cmsgs >>= decodeCmsg) :: Maybe Fd of
@@ -167,19 +161,29 @@
       Just (Fd fd) -> return fd
   where
     dummyBufSize = 16
-#else
-recvFd _ = error "Network.Socket.recvFd"
-#endif
 
 -- | Build a pair of connected socket objects.
---   For portability, use this function in the case
---   where 'isUnixDomainSocketAvailable' is 'True'
---   and specify 'AF_UNIX' to the first argument.
+--   On Windows, this function emulates socketpair() using
+--   'AF_UNIX' and a temporary file will remain.
 socketPair :: Family              -- Family Name (usually AF_UNIX)
            -> SocketType          -- Socket Type (usually Stream)
            -> ProtocolNumber      -- Protocol Number
            -> IO (Socket, Socket) -- unnamed and connected.
-#if defined(DOMAIN_SOCKET_SUPPORT)
+#if defined(mingw32_HOST_OS)
+socketPair _ _ _ = withSystemTempFile "temp-for-pair" $ \file hdl -> do
+    hClose hdl
+    removeFile file
+    listenSock <- socket AF_UNIX Stream defaultProtocol
+    bind listenSock $ SockAddrUnix file
+    listen listenSock 10
+    clientSock <- socket AF_UNIX Stream defaultProtocol
+    connect clientSock $ SockAddrUnix file
+    (serverSock, _ :: SockAddr) <- accept listenSock
+    close listenSock
+    withFdSocket clientSock setNonBlockIfNeeded
+    withFdSocket serverSock setNonBlockIfNeeded
+    return (clientSock, serverSock)
+#else
 socketPair family stype protocol =
     allocaBytes (2 * sizeOf (1 :: CInt)) $ \ fdArr -> do
       let c_stype = packSocketType stype
@@ -194,6 +198,4 @@
 
 foreign import ccall unsafe "socketpair"
   c_socketpair :: CInt -> CInt -> CInt -> Ptr CInt -> IO CInt
-#else
-socketPair _ _ _ = error "Network.Socket.socketPair"
 #endif
diff --git a/configure b/configure
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for Haskell network package 3.1.3.0.
+# Generated by GNU Autoconf 2.69 for Haskell network package 3.1.4.0.
 #
 # Report bugs to <libraries@haskell.org>.
 #
@@ -580,8 +580,8 @@
 # Identity of this package.
 PACKAGE_NAME='Haskell network package'
 PACKAGE_TARNAME='network'
-PACKAGE_VERSION='3.1.3.0'
-PACKAGE_STRING='Haskell network package 3.1.3.0'
+PACKAGE_VERSION='3.1.4.0'
+PACKAGE_STRING='Haskell network package 3.1.4.0'
 PACKAGE_BUGREPORT='libraries@haskell.org'
 PACKAGE_URL=''
 
@@ -1234,7 +1234,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures Haskell network package 3.1.3.0 to adapt to many kinds of systems.
+\`configure' configures Haskell network package 3.1.4.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1299,7 +1299,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of Haskell network package 3.1.3.0:";;
+     short | recursive ) echo "Configuration of Haskell network package 3.1.4.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1384,7 +1384,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Haskell network package configure 3.1.3.0
+Haskell network package configure 3.1.4.0
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1910,7 +1910,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by Haskell network package $as_me 3.1.3.0, which was
+It was created by Haskell network package $as_me 3.1.4.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -4419,7 +4419,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by Haskell network package $as_me 3.1.3.0, which was
+This file was extended by Haskell network package $as_me 3.1.4.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -4472,7 +4472,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-Haskell network package config.status 3.1.3.0
+Haskell network package config.status 3.1.4.0
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,5 @@
 AC_INIT([Haskell network package],
-        [3.1.3.0],
+        [3.1.4.0],
         [libraries@haskell.org],
         [network])
 
diff --git a/include/HsNetDef.h b/include/HsNetDef.h
--- a/include/HsNetDef.h
+++ b/include/HsNetDef.h
@@ -10,8 +10,6 @@
 #undef PACKAGE_TARNAME
 #undef PACKAGE_VERSION
 
-#define DOMAIN_SOCKET_SUPPORT 1
-
 #if defined(HAVE_STRUCT_UCRED) && HAVE_DECL_SO_PEERCRED
 # define HAVE_STRUCT_UCRED_SO_PEERCRED 1
 #else
diff --git a/network.cabal b/network.cabal
--- a/network.cabal
+++ b/network.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.18
 name:               network
-version:            3.1.3.0
+version:            3.1.4.0
 license:            BSD3
 license-file:       LICENSE
 maintainer:         Kazu Yamamoto, Evan Borden
@@ -124,6 +124,10 @@
     include-dirs:     include
     includes:         HsNet.h HsNetDef.h alignment.h win32defs.h
     install-includes: HsNet.h HsNetDef.h alignment.h win32defs.h
+    if os(windows)
+        includes:         afunix_compat.h
+        install-includes: afunix_compat.h
+
     ghc-options:      -Wall -fwarn-tabs
     build-depends:
         base >=4.9 && <5,
@@ -167,6 +171,9 @@
         if impl(ghc >=7.10)
             cpp-options: -D_WIN32_WINNT=0x0600
             cc-options:  -D_WIN32_WINNT=0x0600
+
+        build-depends:
+            temporary
 
 test-suite spec
     type:             exitcode-stdio-1.0
