diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,6 @@
+# Version 1.5.1.0
+Fix [stackage#4312](https://github.com/commercialhaskell/stackage/issues/4312): Relax `network` upper bound
+
 # Version 1.5.0.1
 Bugfix: `concurrentMerge []` should not block forever, even if this case is
 pathological.
diff --git a/io-streams.cabal b/io-streams.cabal
--- a/io-streams.cabal
+++ b/io-streams.cabal
@@ -1,5 +1,5 @@
 Name:                io-streams
-Version:             1.5.0.1
+Version:             1.5.1.0
 License:             BSD3
 License-file:        LICENSE
 Category:            Data, Network, IO-Streams
@@ -7,7 +7,8 @@
 Maintainer:          Gregory Collins <greg@gregorycollins.net>
 Cabal-version:       >= 1.10
 Synopsis:            Simple, composable, and easy-to-use stream I/O
-Tested-With:         GHC==7.8.4, GHC==7.8.3, GHC==7.6.3, GHC==7.4.2
+Tested-With:         GHC==7.4.2, GHC==7.6.3, GHC==7.8.4, GHC==7.10.3,
+                     GHC==8.0.2, GHC==8.2.2, GHC==8.4.3, GHC==8.6.3
 Bug-Reports:         https://github.com/snapframework/io-streams/issues
 Description:
   /Overview/
@@ -92,8 +93,6 @@
   ghc-options:       -Wall -fwarn-tabs -funbox-strict-fields
                      -fno-warn-unused-do-bind
 
-  ghc-prof-options:  -auto-all
-
   Exposed-modules:   System.IO.Streams,
                      System.IO.Streams.Attoparsec,
                      System.IO.Streams.Attoparsec.ByteString,
@@ -123,11 +122,11 @@
                      attoparsec         >= 0.10  && <0.14,
                      bytestring         >= 0.9   && <0.11,
                      bytestring-builder >= 0.10  && <0.11,
-                     network            >= 2.3   && <2.7,
+                     network            >= 2.3   && <3.1,
                      primitive          >= 0.2   && <0.7,
                      process            >= 1.1   && <1.7,
                      text               >= 0.10  && <1.3,
-                     time               >= 1.2   && <1.9,
+                     time               >= 1.2   && <1.10,
                      transformers       >= 0.2   && <0.6,
                      vector             >= 0.7   && <0.13,
                      zlib-bindings      >= 0.1   && <0.2
@@ -202,22 +201,22 @@
   if !os(windows) && !flag(NoInteractiveTests)
     cpp-options: -DENABLE_PROCESS_TESTS
 
-  Build-depends:     base               >= 4     && <5,
-                     attoparsec         >= 0.10  && <0.14,
-                     bytestring         >= 0.9   && <0.11,
-                     bytestring-builder >= 0.10  && <0.11,
+  Build-depends:     base,
+                     attoparsec,
+                     bytestring,
+                     bytestring-builder,
                      deepseq            >= 1.2   && <1.5,
                      directory          >= 1.1   && <2,
                      filepath           >= 1.2   && <2,
                      mtl                >= 2     && <3,
-                     network            >= 2.3   && <2.7,
-                     primitive          >= 0.2   && <0.7,
-                     process            >= 1.1   && <1.7,
-                     text               >= 0.10  && <1.3,
-                     time               >= 1.2   && <1.9,
-                     transformers       >= 0.2   && <0.6,
-                     vector             >= 0.7   && <0.13,
-                     zlib-bindings      >= 0.1   && <0.2,
+                     network,
+                     primitive,
+                     process,
+                     text,
+                     time,
+                     transformers,
+                     vector,
+                     zlib-bindings,
 
                      HUnit                      >= 1.2      && <2,
                      QuickCheck                 >= 2.3.0.2  && <3,
diff --git a/test/System/IO/Streams/Tests/Concurrent.hs b/test/System/IO/Streams/Tests/Concurrent.hs
--- a/test/System/IO/Streams/Tests/Concurrent.hs
+++ b/test/System/IO/Streams/Tests/Concurrent.hs
@@ -47,7 +47,7 @@
                                  chans
     inputs <- mapM Streams.chanToInput chans
     resultMVar <- newEmptyMVar
-    forkIO (Streams.concurrentMerge inputs >>= Streams.toList
+    _ <- forkIO (Streams.concurrentMerge inputs >>= Streams.toList
                                            >>= putMVar resultMVar)
     putMVar firstMVar 0
     result <- takeMVar resultMVar
diff --git a/test/System/IO/Streams/Tests/Network.hs b/test/System/IO/Streams/Tests/Network.hs
--- a/test/System/IO/Streams/Tests/Network.hs
+++ b/test/System/IO/Streams/Tests/Network.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE CPP #-}
 
 module System.IO.Streams.Tests.Network (tests) where
 
@@ -13,6 +14,10 @@
 import           Test.Framework
 import           Test.Framework.Providers.HUnit
 import           Test.HUnit                         hiding (Test)
+#if MIN_VERSION_network(2,7,0)
+#else
+import           Data.List                          (intercalate)
+#endif
 ------------------------------------------------------------------------------
 import qualified System.IO.Streams.Internal         as Streams
 import qualified System.IO.Streams.Internal.Network as Streams
@@ -32,10 +37,23 @@
     assertEqual "ok" (Just ()) x
 
   where
+    -- compats
+#if MIN_VERSION_network(2,7,0)
+    mkAddr = return . N.tupleToHostAddress
+    defaultPort = N.defaultPort
+    close = N.close
+    bind = N.bind
+#else
+    mkAddr (o1,o2,o3,o4) = N.inet_addr . intercalate "." $ map show [o1,o2,o3,o4]
+    defaultPort = N.aNY_PORT
+    close = N.sClose
+    bind = N.bindSocket
+#endif
+
     go = do
         portMVar   <- newEmptyMVar
         resultMVar <- newEmptyMVar
-        forkIO $ client portMVar resultMVar
+        _ <- forkIO $ client portMVar resultMVar
         server portMVar
         l <- takeMVar resultMVar
         assertEqual "testSocket" l ["ok"]
@@ -43,28 +61,28 @@
     client mvar resultMVar = do
         port <- takeMVar mvar
         sock <- N.socket N.AF_INET N.Stream N.defaultProtocol
-        addr <- N.inet_addr "127.0.0.1"
+        addr <- mkAddr (127, 0, 0, 1)
         let saddr = N.SockAddrInet port addr
         N.connect sock saddr
         (is, os) <- Streams.socketToStreams sock
         Streams.fromList ["", "ok"] >>= Streams.connectTo os
         N.shutdown sock N.ShutdownSend
         Streams.toList is >>= putMVar resultMVar
-        N.sClose sock
+        close sock
 
     server mvar = do
         sock  <- N.socket N.AF_INET N.Stream N.defaultProtocol
-        addr  <- N.inet_addr "127.0.0.1"
-        let saddr = N.SockAddrInet N.aNY_PORT addr
-        N.bindSocket sock saddr
+        addr <- mkAddr (127, 0, 0, 1)
+        let saddr = N.SockAddrInet defaultPort addr
+        bind sock saddr
         N.listen sock 5
         port  <- N.socketPort sock
         putMVar mvar port
         (csock, _) <- N.accept sock
         (is, os) <- Streams.socketToStreams csock
         Streams.toList is >>= flip Streams.writeList os
-        N.sClose csock
-        N.sClose sock
+        close csock
+        close sock
 
 testSocketWithError :: Test
 testSocketWithError = testCase "network/socket-error" $ N.withSocketsDo $ do
