diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,11 @@
+## 0.4.0.6 (2015-05-08)
+
+ * Support GHC 7.10.
+ 
+ * Re-raise exceptions in the server thread in the main thread.
+ 
+ * Improve Windows support.
+
 ## 0.4.0.5 (2014-11-30)
 
  * Support network-2.6.
diff --git a/System/Remote/Monitoring.hs b/System/Remote/Monitoring.hs
--- a/System/Remote/Monitoring.hs
+++ b/System/Remote/Monitoring.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE CPP, OverloadedStrings #-}
 
 -- | This module provides remote monitoring of a running process over
 -- HTTP.  It can be used to run an HTTP server that provides both a
@@ -43,7 +43,7 @@
     , getDistribution
     ) where
 
-import Control.Concurrent (ThreadId, forkIO)
+import Control.Concurrent (ThreadId, myThreadId, throwTo)
 import qualified Data.ByteString as S
 import Data.Int (Int64)
 import qualified Data.Text as T
@@ -56,7 +56,15 @@
 import qualified System.Metrics.Gauge as Gauge
 import qualified System.Metrics.Label as Label
 import System.Remote.Snap
+import Network.Socket (withSocketsDo)
 
+#if __GLASGOW_HASKELL__ >= 706
+import Control.Concurrent (forkFinally)
+#else
+import Control.Concurrent (forkIO)
+import Control.Exception (SomeException, mask, try)
+#endif
+
 -- $configuration
 --
 -- To make full use out of this this module you must first enable GC
@@ -203,7 +211,7 @@
 -- either a numeric network address (dotted quad for IPv4,
 -- colon-separated hex for IPv6) or a hostname (e.g. \"localhost\".)
 -- The client can control the Content-Type used in responses by
--- setting the Accept header.  At the moment three content types are
+-- setting the Accept header.  At the moment two content types are
 -- available: \"application\/json\" and \"text\/html\".
 --
 -- Registers the following counter, used by the UI:
@@ -223,7 +231,11 @@
                -> IO Server
 forkServerWith store host port = do
     Metrics.registerCounter "ekg.server_timestamp_ms" getTimeMs store
-    tid <- forkIO $ startServer store host port
+    me <- myThreadId
+    tid <- withSocketsDo $ forkFinally (startServer store host port) $ \ r ->
+        case r of
+            Left e  -> throwTo me e
+            Right _ -> return ()
     return $! Server tid store
   where
     getTimeMs :: IO Int64
@@ -264,3 +276,13 @@
                 -> IO Distribution.Distribution
 getDistribution name server =
     Metrics.createDistribution name (serverMetricStore server)
+
+------------------------------------------------------------------------
+-- Backwards compatibility shims
+
+#if __GLASGOW_HASKELL__ < 706
+forkFinally :: IO a -> (Either SomeException a -> IO ()) -> IO ThreadId
+forkFinally action and_then =
+  mask $ \restore ->
+    forkIO $ try (restore action) >>= and_then
+#endif
diff --git a/ekg.cabal b/ekg.cabal
--- a/ekg.cabal
+++ b/ekg.cabal
@@ -1,5 +1,5 @@
 name:                ekg
-version:             0.4.0.5
+version:             0.4.0.6
 synopsis:            Remote monitoring of processes
 description:
   This library lets you remotely monitor a running process over HTTP.
@@ -38,15 +38,15 @@
 
   build-depends:
     aeson < 0.9,
-    base >= 4.5 && < 4.8,
+    base >= 4.5 && < 4.9,
     bytestring < 1.0,
     ekg-core >= 0.1 && < 0.2,
-    filepath < 1.4,
+    filepath < 1.5,
     network < 2.7,
     snap-core < 0.10,
     snap-server < 0.10,
     text < 1.3,
-    time < 1.5,
+    time < 1.6,
     transformers < 0.5,
     unordered-containers < 0.3
 
