diff --git a/Network/BSD.hsc b/Network/BSD.hsc
--- a/Network/BSD.hsc
+++ b/Network/BSD.hsc
@@ -352,7 +352,11 @@
         return (HostEntry {
                         hostName       = h_name,
                         hostAliases    = h_aliases,
+#if defined(HAVE_WINSOCK_H) && !defined(cygwin32_HOST_OS)
+                        hostFamily     = unpackFamily (fromIntegral (h_addrtype :: CShort)),
+#else
                         hostFamily     = unpackFamily h_addrtype,
+#endif
                         hostAddresses  = h_addr_list
                 })
 
diff --git a/Network/Socket.hsc b/Network/Socket.hsc
--- a/Network/Socket.hsc
+++ b/Network/Socket.hsc
@@ -1502,6 +1502,8 @@
 #ifdef AF_BLUETOOTH
 	(#const AF_BLUETOOTH) -> AF_BLUETOOTH
 #endif
+	unknown -> error ("Network.Socket.unpackFamily: unknown address " ++
+                          "family " ++ show unknown)
 
 -- Socket Types.
 
@@ -1986,19 +1988,23 @@
     as <- (#peek struct addrinfo, ai_next) ptr_ai >>= followAddrInfo
     return (a:as)
 
-foreign import ccall safe "getaddrinfo"
+foreign import ccall safe "hsnet_getaddrinfo"
     c_getaddrinfo :: CString -> CString -> Ptr AddrInfo -> Ptr (Ptr AddrInfo)
                   -> IO CInt
 
-foreign import ccall safe "freeaddrinfo"
+foreign import ccall safe "hsnet_freeaddrinfo"
     c_freeaddrinfo :: Ptr AddrInfo -> IO ()
 
 gai_strerror :: CInt -> IO String
 
+#ifdef HAVE_GAI_STRERROR
 gai_strerror n = c_gai_strerror n >>= peekCString
 
 foreign import ccall safe "gai_strerror"
     c_gai_strerror :: CInt -> IO CString
+#else
+gai_strerror n = return ("error " ++ show n)
+#endif
 
 withCStringIf :: Bool -> Int -> (CSize -> CString -> IO a) -> IO a
 withCStringIf False _ f = f 0 nullPtr
diff --git a/Network/Socket/Internal.hsc b/Network/Socket/Internal.hsc
--- a/Network/Socket/Internal.hsc
+++ b/Network/Socket/Internal.hsc
@@ -18,7 +18,7 @@
 
 #include "HsNet.h"
 
-#if defined(HAVE_WINSOCK_H) && !defined(cygwin32_HOST_OS)
+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)
 #define WITH_WINSOCK  1
 #endif
 
@@ -57,7 +57,7 @@
       Family(..),
 
       -- * Socket error functions
-#if defined(HAVE_WINSOCK_H) && !defined(cygwin32_HOST_OS)
+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)
       c_getLastError,
 #endif
       throwSocketError,
@@ -82,7 +82,7 @@
 import Foreign.Ptr ( Ptr, castPtr, plusPtr )
 import Foreign.Storable ( Storable(..) )
 
-#if defined(HAVE_WINSOCK_H) && !defined(cygwin32_HOST_OS)
+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)
 import Control.Exception ( finally )
 #  if __GLASGOW_HASKELL__
 import GHC.IOBase ( IOErrorType(..) )
@@ -556,7 +556,7 @@
 {-# SPECIALIZE throwSocketErrorIfMinus1RetryMayBlock
         :: String -> IO b -> IO CInt -> IO CInt #-}
 
-#if defined(__GLASGOW_HASKELL__) && (!defined(HAVE_WINSOCK_H) || defined(cygwin32_HOST_OS))
+#if defined(__GLASGOW_HASKELL__) && (!defined(HAVE_WINSOCK2_H) || defined(cygwin32_HOST_OS))
 
 throwSocketErrorIfMinus1RetryMayBlock name on_block act =
     throwErrnoIfMinus1RetryMayBlock name act on_block
@@ -576,7 +576,7 @@
   throwSocketErrorIfMinus1Retry name act
   return ()
 
-# if defined(HAVE_WINSOCK_H) && !defined(cygwin32_HOST_OS)
+# if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)
 throwSocketErrorIfMinus1Retry name act = do
   r <- act
   if (r == -1)
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,19 @@
 AC_INIT([Haskell network package], [1.0], [libraries@haskell.org], [network])
 
+ac_includes_default="$ac_includes_default
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+# include <winsock2.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+#endif
+#ifdef HAVE_WSPIAPI_H
+# include <wspiapi.h>
+#endif"
+
 # Safety check: Ensure that we are in the correct source directory.
 AC_CONFIG_SRCDIR([include/HsNet.h])
 
@@ -15,7 +29,7 @@
 AC_C_CONST
 
 dnl ** check for specific header (.h) files that we are interested in
-AC_CHECK_HEADERS([fcntl.h limits.h stdlib.h sys/types.h unistd.h winsock.h])
+AC_CHECK_HEADERS([fcntl.h limits.h stdlib.h sys/types.h unistd.h winsock2.h ws2tcpip.h wspiapi.h])
 AC_CHECK_HEADERS([arpa/inet.h netdb.h netinet/in.h netinet/tcp.h sys/socket.h sys/uio.h sys/un.h])
 
 AC_CHECK_FUNCS([readlink symlink])
@@ -81,15 +95,37 @@
 fi
 
 dnl --------------------------------------------------
+dnl * check for Windows networking libraries
+dnl --------------------------------------------------
+AC_CHECK_LIB(ws2_32, _head_libws2_32_a)
+
+dnl --------------------------------------------------
 dnl * test for getaddrinfo as proxy for IPv6 support
 dnl --------------------------------------------------
-AC_CHECK_FUNCS(getaddrinfo)
+AC_MSG_CHECKING(for getaddrinfo)
+dnl Can't use AC_CHECK_FUNC here, because it doesn't do the right
+dnl thing on Windows.
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$ac_includes_default
+int testme(){ getaddrinfo; }]])],[AC_DEFINE([HAVE_GETADDRINFO], [1], [Define to 1 if you have the `getaddrinfo' function.]) ac_have_getaddrinfo=yes; AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)])
 
+dnl Under mingw, we may need to set WINVER to 0x0501 to expose getaddrinfo.
+if test "x$ac_have_getaddrinfo" = x; then
+  old_CFLAGS="$CFLAGS"
+  if test "z$ac_cv_lib_ws2_32__head_libws2_32_a" = zyes; then
+    CFLAGS="-DWINVER=0x0501 $CFLAGS"
+    AC_MSG_CHECKING(for getaddrinfo if WINVER is 0x0501)
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$ac_includes_default
+    int testme(){ getaddrinfo; }]])],[AC_DEFINE([HAVE_GETADDRINFO], [1], [Define to 1 if you have the `getaddrinfo' function.]) AC_DEFINE([NEED_WINVER_XP], [1], [Define to 1 if the `getaddrinfo' function needs WINVER set.]) EXTRA_CPPFLAGS="-DWINVER=0x0501 $EXTRA_CPPFLAGS"; AC_MSG_RESULT(yes)],[CFLAGS="$old_CFLAGS"; AC_MSG_RESULT(no)])
+  fi
+fi
+
+dnl Missing under mingw, sigh.
+AC_CHECK_FUNCS(gai_strerror)
+
 dnl -------------------------------------------------------
 dnl * test for AI_* flags that not all implementations have
 dnl -------------------------------------------------------
-AC_CHECK_DECLS([AI_ADDRCONFIG, AI_ALL, AI_NUMERICSERV, AI_V4MAPPED], , ,
- [#include <netdb.h>])
+AC_CHECK_DECLS([AI_ADDRCONFIG, AI_ALL, AI_NUMERICSERV, AI_V4MAPPED])
 
 dnl --------------------------------------------------
 dnl * test for Linux sendfile(2)
@@ -112,7 +148,7 @@
 case "$host" in
 *-mingw32)
 	EXTRA_SRCS="cbits/initWinSock.c, cbits/winSockErr.c, cbits/asyncAccept.c"
-	EXTRA_LIBS=wsock32
+	EXTRA_LIBS=ws2_32
 	CALLCONV=stdcall ;;
 *-solaris2*)
 	EXTRA_SRCS="cbits/ancilData.c"
diff --git a/include/HsNet.h b/include/HsNet.h
--- a/include/HsNet.h
+++ b/include/HsNet.h
@@ -9,6 +9,10 @@
 
 #include "HsNetworkConfig.h"
 
+#ifdef NEED_WINVER
+# define WINVER 0x0501
+#endif
+
 /* ultra-evil... */
 #undef PACKAGE_BUGREPORT
 #undef PACKAGE_NAME
@@ -32,8 +36,14 @@
 # undef IPV6_SOCKET_SUPPORT
 #endif
 
-#if defined(HAVE_WINSOCK_H) && !defined(__CYGWIN__)
-#include <winsock.h>
+#if defined(HAVE_WINSOCK2_H) && !defined(__CYGWIN__)
+#include <winsock2.h>
+# ifdef HAVE_WS2TCPIP_H
+#  include <ws2tcpip.h>
+# endif
+# ifdef HAVE_WSPIAPI_H
+#  include <wspiapi.h>
+# endif
 
 extern void  shutdownWinSock();
 extern int   initWinSock ();
@@ -118,11 +128,11 @@
 	      void** pData,
 	      int* pLen);
 
-#endif /* HAVE_WINSOCK_H && !__CYGWIN */
+#endif /* HAVE_WINSOCK2_H && !__CYGWIN */
 
 INLINE char *
 my_inet_ntoa(
-#if defined(HAVE_WINSOCK_H)
+#if defined(HAVE_WINSOCK2_H)
              u_long addr
 #elif defined(HAVE_IN_ADDR_T)
              in_addr_t addr
@@ -137,5 +147,20 @@
     a.s_addr = addr;
     return inet_ntoa(a);
 }
+
+#ifdef HAVE_GETADDRINFO
+INLINE int
+hsnet_getaddrinfo(const char *hostname, const char *servname,
+		  const struct addrinfo *hints, struct addrinfo **res)
+{
+    return getaddrinfo(hostname, servname, hints, res);
+}
+
+INLINE void
+hsnet_freeaddrinfo(struct addrinfo *ai)
+{
+    freeaddrinfo(ai);
+}
+#endif
 
 #endif
diff --git a/network.cabal b/network.cabal
--- a/network.cabal
+++ b/network.cabal
@@ -1,5 +1,5 @@
 name:           network
-version:        2.2.1.1
+version:        2.2.1.2
 license:        BSD3
 license-file:   LICENSE
 maintainer:     Johan Tibell <johan.tibell@gmail.com>
