diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,8 @@
+# 3.0.2
+
+- Supporting conduit 1.3 [#105](https://github.com/kazu-yamamoto/dns/pull/105)
+- Supporting GHC 8.4 with semigroup hack.
+
 # 3.0.1
 
 - Supporting GHC 7.8 again.
diff --git a/Network/DNS/IO.hs b/Network/DNS/IO.hs
--- a/Network/DNS/IO.hs
+++ b/Network/DNS/IO.hs
@@ -31,7 +31,7 @@
 import qualified Data.ByteString.Char8 as BS
 import qualified Data.ByteString.Lazy.Char8 as LBS
 import Data.Char (ord)
-import Data.Conduit (($$), ($$+), ($$+-), (=$), Sink)
+import Data.Conduit (($$+), ($$+-), ConduitM, (.|), runConduit)
 import Data.Conduit.Attoparsec (sinkParser)
 import qualified Data.Conduit.Binary as CB
 import Data.Conduit.Network (sourceSocket)
@@ -53,13 +53,13 @@
 
 ----------------------------------------------------------------
 
-sink :: Sink ByteString IO (DNSMessage, PState)
+sink :: ConduitM ByteString o IO (DNSMessage, PState)
 sink = sinkParser $ ST.runStateT getResponse initialState
 
 -- | Receiving DNS data from 'Socket' and parse it.
 
 receive :: Socket -> IO DNSMessage
-receive sock = fst <$> (sourceSocket sock $$ sink)
+receive sock = fst <$> runConduit (sourceSocket sock .| sink)
 
 -- | Receive and parse a single virtual-circuit (TCP) query or response.
 --   It is up to the caller to implement any desired timeout.
@@ -70,7 +70,7 @@
     let len = case map ord $ LBS.unpack lenbytes of
                 [hi, lo] -> 256 * hi + lo
                 _        -> 0
-    fst <$> (src $$+- CB.isolate len =$ sink)
+    fst <$> (src $$+- CB.isolate len .| sink)
 
 ----------------------------------------------------------------
 
diff --git a/Network/DNS/StateBinary.hs b/Network/DNS/StateBinary.hs
--- a/Network/DNS/StateBinary.hs
+++ b/Network/DNS/StateBinary.hs
@@ -1,4 +1,6 @@
-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
+{-# LANGUAGE TypeSynonymInstances #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE CPP #-}
 module Network.DNS.StateBinary (
     PState(..)
   , initialState
@@ -43,6 +45,7 @@
 import qualified Data.IntMap as IM
 import Data.Map (Map)
 import qualified Data.Map as M
+import Data.Semigroup as Sem
 
 import Network.DNS.Imports
 import Network.DNS.Types
@@ -59,9 +62,14 @@
 initialWState :: WState
 initialWState = WState M.empty 0
 
+instance Sem.Semigroup SPut where
+    p1 <> p2 = (Sem.<>) <$> p1 <*> p2
+
 instance Monoid SPut where
     mempty = return mempty
-    mappend a b = mconcat <$> sequence [a, b]
+#if !(MIN_VERSION_base(4,11,0))
+    mappend = (Sem.<>)
+#endif
 
 put8 :: Word8 -> SPut
 put8 = fixedSized 1 BB.word8
diff --git a/dns.cabal b/dns.cabal
--- a/dns.cabal
+++ b/dns.cabal
@@ -1,5 +1,5 @@
 Name:                   dns
-Version:                3.0.1
+Version:                3.0.2
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
