diff --git a/src/System/ZMQ4/Patterns/RequestReply.hs b/src/System/ZMQ4/Patterns/RequestReply.hs
--- a/src/System/ZMQ4/Patterns/RequestReply.hs
+++ b/src/System/ZMQ4/Patterns/RequestReply.hs
@@ -5,7 +5,7 @@
 {-# LANGUAGE ScopedTypeVariables #-}
 module System.ZMQ4.Patterns.RequestReply (
   -- * Type class
-  RequestReply(..)
+  RequestReply
 
   -- * Server and client
 , responder
@@ -16,7 +16,6 @@
 import Control.Monad.IO.Class (liftIO)
 
 import Data.Binary
-import Data.Proxy (Proxy)
 import qualified Data.ByteString.Lazy as BL
 
 import System.ZMQ4.Monadic
@@ -36,15 +35,16 @@
 -- >>> data A = A deriving (Binary, Show)
 -- >>> data B = B deriving (Binary, Show)
 -- >>>
--- >>> instance RequestReply A B where
--- >>>     reply _ = B
+-- >>> instance RequestReply A B
 -- >>>
+-- >>> reply :: A -> IO B
+-- >>> reply _ = return B
+-- >>>
 -- >>> main :: IO ()
--- >>> main = withAsync (responder @A Proxy "tcp://*:5000") $ \_ ->
+-- >>> main = withAsync (responder "tcp://*:5000" reply) $ \_ ->
 -- >>>     requester "tcp://127.0.0.1:5000" A >>= print
 --
 class (Binary a, Binary b) => RequestReply a b | a -> b where
-    reply :: a -> IO b
 
 -- | Start responding using the given type class.
 --
@@ -53,10 +53,10 @@
 -- Silently ignores a request when decoding fails
 responder :: forall a b .
             RequestReply a b
-         => Proxy a             -- ^ Proxy type of the request type
-         -> String              -- ^ Address to bind to
+         => String              -- ^ Address to bind to
+         -> (a -> IO b)         -- ^ Reply function
          -> IO ()
-responder _ addr = runZMQ $ do
+responder addr reply = runZMQ $ do
     rep <- socket Rep
     bind rep addr
 
diff --git a/test/Test/System/ZMQ4/Patterns/RequestReply.hs b/test/Test/System/ZMQ4/Patterns/RequestReply.hs
--- a/test/Test/System/ZMQ4/Patterns/RequestReply.hs
+++ b/test/Test/System/ZMQ4/Patterns/RequestReply.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE FunctionalDependencies #-}
-{-# LANGUAGE TypeApplications #-}
 module Test.System.ZMQ4.Patterns.RequestReply (tests) where
 
 import Control.Concurrent.Async
@@ -8,7 +7,6 @@
 import Control.Monad (replicateM)
 
 import Data.Binary
-import Data.Proxy
 
 import GHC.Generics (Generic)
 
@@ -34,10 +32,12 @@
 
 instance Binary Response
 
-instance RequestReply Request Response where
-    reply ReqA = return RepA
-    reply ReqB = return RepB
+instance RequestReply Request Response
 
+reply :: Request -> IO Response
+reply ReqA = return RepA
+reply ReqB = return RepB
+
 newtype TestSetup = TestSetup [Request] deriving (Show)
 
 instance Arbitrary TestSetup where
@@ -45,7 +45,7 @@
 
 prop_server_client :: TestSetup -> Property
 prop_server_client (TestSetup reqs) = within (10*1000*1000) $ ioProperty $
-    withAsync (responder @Request Proxy addr) $ \_ ->
+    withAsync (responder addr reply) $ \_ ->
         checkAll reqs
 
   where
diff --git a/zeromq4-patterns.cabal b/zeromq4-patterns.cabal
--- a/zeromq4-patterns.cabal
+++ b/zeromq4-patterns.cabal
@@ -1,5 +1,5 @@
 name:           zeromq4-patterns
-version:        0.2.0.0
+version:        0.3.0.0
 synopsis:       Haskell implementation of several ZeroMQ patterns.
 description:
     Haskell implementation of several ZeroMQ patterns that you can find in the
@@ -31,7 +31,6 @@
                       , bytestring
                       , exceptions
                       , stm
-                      , transformers
                       , zeromq4-haskell
   default-language:     Haskell2010
   ghc-options:          -Wall
