diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+0.6.1
+-----------------------------------------------------------------------------
+- Bug fixes: #55
+- Build fixes for GHC versions < 7.6
+
 0.6
 -----------------------------------------------------------------------------
 - Update to `exceptions` 0.6
diff --git a/examples/Makefile b/examples/Makefile
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -1,8 +1,8 @@
 all: chat
 
 chat: display.hs prompt.hs
-	ghc --make -threaded display.hs
-	ghc --make -threaded prompt.hs
+	cabal exec ghc -- --make -threaded display.hs
+	cabal exec ghc -- --make -threaded prompt.hs
 
 .PHONY: clean
 clean:
diff --git a/examples/prompt.hs b/examples/prompt.hs
--- a/examples/prompt.hs
+++ b/examples/prompt.hs
@@ -7,7 +7,6 @@
 import System.Exit
 import System.Environment
 import System.ZMQ4.Monadic
-import qualified Data.ByteString.UTF8 as SB
 
 main :: IO ()
 main = do
@@ -21,5 +20,5 @@
         pub <- socket Pub
         bind pub addr
         forever $ do
-            line <- liftIO $ SB.fromString <$> getLine
+            line <- liftIO $ fromString <$> getLine
             send pub [] (name <> line)
diff --git a/src/System/ZMQ4.hs b/src/System/ZMQ4.hs
--- a/src/System/ZMQ4.hs
+++ b/src/System/ZMQ4.hs
@@ -230,7 +230,7 @@
 import qualified Prelude              as P
 import qualified System.ZMQ4.Base     as B
 
-import GHC.Conc (threadWaitRead, threadWaitWrite)
+import GHC.Conc (threadWaitRead)
 import GHC.Generics(Generic)
 
 -----------------------------------------------------------------------------
@@ -948,31 +948,31 @@
 retry :: String -> IO () -> IO CInt -> IO ()
 retry msg wait act = throwIfMinus1RetryMayBlock_ msg act wait
 
-wait' :: (Fd -> IO ()) -> ZMQPollEvent -> Socket a -> IO ()
+wait' :: ZMQPollEvent -> Socket a -> IO ()
 #ifdef mingw32_HOST_OS
-wait' _ _ _ = return ()
+wait' _ _ = return ()
 #else
-wait' w f s = do
-    fd <- getIntOpt s B.filedesc 0
-    w (Fd fd)
-    evs <- getInt32Option B.events s
-    unless (testev evs) $
-        wait' w f s
+wait' p s = do
+    e <- getInt32Option B.events s
+    unless (testev e) $ do
+        fd <- getIntOpt s B.filedesc 0
+        threadWaitRead (Fd fd)
+        wait' p s
   where
-    testev e = e .&. fromIntegral (pollVal f) /= 0
+    testev e = e .&. fromIntegral (pollVal p) /= 0
 #endif
 
 -- | Wait until data is available for reading from the given Socket.
 -- After this function returns, a call to 'receive' will essentially be
 -- non-blocking.
 waitRead :: Socket a -> IO ()
-waitRead = wait' threadWaitRead pollIn
+waitRead = wait' pollIn
 
 -- | Wait until data can be written to the given Socket.
 -- After this function returns, a call to 'send' will essentially be
 -- non-blocking.
 waitWrite :: Socket a -> IO ()
-waitWrite = wait' threadWaitWrite pollOut
+waitWrite = wait' pollOut
 
 -- | Starts built-in 0MQ proxy
 -- (cf. <http://api.zeromq.org/4-0:zmq-proxy zmq_proxy>)
diff --git a/zeromq4-haskell.cabal b/zeromq4-haskell.cabal
--- a/zeromq4-haskell.cabal
+++ b/zeromq4-haskell.cabal
@@ -1,5 +1,5 @@
 name:               zeromq4-haskell
-version:            0.6
+version:            0.6.1
 synopsis:           Bindings to ZeroMQ 4.x
 category:           System, FFI
 license:            MIT
@@ -60,6 +60,9 @@
         , exceptions   == 0.6.*
         , semigroups   >= 0.8
         , transformers >= 0.3
+
+    if impl(ghc < 7.6)
+        build-depends: ghc-prim == 0.3.*
 
     if os(windows)
         extra-libraries: zmq
