diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,7 @@
+# 3.0.1
+
+- Supporting GHC 7.8 again.
+
 # 3.0.0
 
 - The version introduces some breaking changes internally. But upper layer APIs in the `Lookup` module remain the same.
diff --git a/Network/DNS/Decode.hs b/Network/DNS/Decode.hs
--- a/Network/DNS/Decode.hs
+++ b/Network/DNS/Decode.hs
@@ -1,5 +1,3 @@
-{-# LANGUAGE CPP #-}
-
 -- | Decoders for DNS.
 module Network.DNS.Decode (
     -- * Decoder
@@ -13,15 +11,10 @@
   , decodeMailbox
   ) where
 
-import Control.Applicative (many)
-import Data.ByteString (ByteString)
+import Network.DNS.Decode.Internal
+import Network.DNS.Imports
 import Network.DNS.StateBinary
 import Network.DNS.Types
-import Network.DNS.Decode.Internal
-
-#if __GLASGOW_HASKELL__ < 709
-import Control.Applicative
-#endif
 
 ----------------------------------------------------------------
 
diff --git a/Network/DNS/Decode/Internal.hs b/Network/DNS/Decode/Internal.hs
--- a/Network/DNS/Decode/Internal.hs
+++ b/Network/DNS/Decode/Internal.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE OverloadedStrings, CPP #-}
+{-# LANGUAGE OverloadedStrings #-}
 
 module Network.DNS.Decode.Internal (
     getResponse
@@ -10,21 +10,14 @@
   , getMailbox
   ) where
 
-import Control.Monad (replicateM)
-import Data.Bits ((.&.), shiftR, testBit)
-import Data.ByteString (ByteString)
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Char8 as BS
 import Data.IP (IP(..), toIPv4, toIPv6b)
-import Data.Word (Word16)
-import Network.DNS.StateBinary
-import Network.DNS.Types
-import Numeric (showHex)
 import qualified Safe
 
-#if __GLASGOW_HASKELL__ < 709
-import Control.Applicative
-#endif
+import Network.DNS.Imports
+import Network.DNS.StateBinary
+import Network.DNS.Types
 
 ----------------------------------------------------------------
 
diff --git a/Network/DNS/Encode.hs b/Network/DNS/Encode.hs
--- a/Network/DNS/Encode.hs
+++ b/Network/DNS/Encode.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE RecordWildCards, CPP #-}
+{-# LANGUAGE RecordWildCards #-}
 
 -- | Encoders for DNS.
 module Network.DNS.Encode (
@@ -12,23 +12,15 @@
   , encodeMailbox
   ) where
 
-import Control.Monad (when)
 import Control.Monad.State (State, modify, execState, gets)
-import Data.Binary (Word16)
-import Data.Bits ((.|.), bit, shiftL)
 import qualified Data.ByteString.Builder as BB
-import Data.ByteString.Char8 (ByteString)
 import qualified Data.ByteString.Char8 as BS
 import qualified Data.ByteString.Lazy.Char8 as LBS
 import Data.IP (IP(..), fromIPv4, fromIPv6b)
-import Data.List (dropWhileEnd)
-import Data.Monoid ((<>))
+
+import Network.DNS.Imports
 import Network.DNS.StateBinary
 import Network.DNS.Types
-
-#if __GLASGOW_HASKELL__ < 709
-import Data.Monoid (mconcat)
-#endif
 
 ----------------------------------------------------------------
 
diff --git a/Network/DNS/IO.hs b/Network/DNS/IO.hs
--- a/Network/DNS/IO.hs
+++ b/Network/DNS/IO.hs
@@ -27,7 +27,6 @@
 #endif
 
 import qualified Control.Monad.State as ST
-import Data.ByteString (ByteString)
 import qualified Data.ByteString.Builder as BB
 import qualified Data.ByteString.Char8 as BS
 import qualified Data.ByteString.Lazy.Char8 as LBS
@@ -37,25 +36,20 @@
 import qualified Data.Conduit.Binary as CB
 import Data.Conduit.Network (sourceSocket)
 import Data.IP (IPv4, IPv6)
-import Data.Monoid ((<>))
-import Network (Socket)
-
-#ifdef GHC708
-import Control.Applicative ((<$>))
-#endif
+import Network.Socket (Socket)
 
 #if defined(WIN) && defined(GHC708)
 import Network.Socket (send)
 import qualified Data.ByteString.Char8 as BS
-import Control.Monad (when)
 #else
 import Network.Socket.ByteString (sendAll)
 #endif
 
-import Network.DNS.Types
-import Network.DNS.Encode (encode)
 import Network.DNS.Decode.Internal (getResponse)
+import Network.DNS.Encode (encode)
+import Network.DNS.Imports
 import Network.DNS.StateBinary (PState, initialState)
+import Network.DNS.Types
 
 ----------------------------------------------------------------
 
diff --git a/Network/DNS/Imports.hs b/Network/DNS/Imports.hs
new file mode 100644
--- /dev/null
+++ b/Network/DNS/Imports.hs
@@ -0,0 +1,27 @@
+module Network.DNS.Imports (
+    ByteString
+  , NonEmpty(..)
+  , module Control.Applicative
+  , module Control.Monad
+  , module Data.Bits
+  , module Data.List
+  , module Data.Maybe
+  , module Data.Monoid
+  , module Data.Ord
+  , module Data.Typeable
+  , module Data.Word
+  , module Numeric
+  ) where
+
+import Control.Applicative
+import Control.Monad
+import Data.Bits
+import Data.ByteString (ByteString)
+import Data.List
+import Data.List.NonEmpty (NonEmpty(..))
+import Data.Maybe
+import Data.Monoid
+import Data.Ord
+import Data.Typeable
+import Data.Word
+import Numeric
diff --git a/Network/DNS/Lookup.hs b/Network/DNS/Lookup.hs
--- a/Network/DNS/Lookup.hs
+++ b/Network/DNS/Lookup.hs
@@ -72,13 +72,14 @@
   , lookupSRV
   ) where
 
-import Data.ByteString (ByteString)
 import qualified Data.ByteString.Char8 as BS
 import Data.IP (IPv4, IPv6)
-import Network.DNS.Resolver as DNS
+
+import Network.DNS.Imports
 import Network.DNS.LookupRaw as DNS
+import Network.DNS.Resolver as DNS
 import Network.DNS.Types
-import Data.Word (Word16, Word32)
+
 
 ----------------------------------------------------------------
 
diff --git a/Network/DNS/LookupRaw.hs b/Network/DNS/LookupRaw.hs
--- a/Network/DNS/LookupRaw.hs
+++ b/Network/DNS/LookupRaw.hs
@@ -11,16 +11,15 @@
   , fromDNSFormat
   ) where
 
-import Control.Monad (when)
 import Data.Time (getCurrentTime, addUTCTime)
+import Prelude hiding (lookup)
 
 import Network.DNS.IO
+import Network.DNS.Imports hiding (lookup)
 import Network.DNS.Memo
 import Network.DNS.Transport
 import Network.DNS.Types
 import Network.DNS.Types.Internal
-
-import Prelude hiding (lookup)
 
 -- $setup
 -- >>> import Network.DNS.Resolver
diff --git a/Network/DNS/Memo.hs b/Network/DNS/Memo.hs
--- a/Network/DNS/Memo.hs
+++ b/Network/DNS/Memo.hs
@@ -1,14 +1,12 @@
 module Network.DNS.Memo where
 
-import Control.Applicative ((<$>))
 import qualified Control.Reaper as R
-import Data.ByteString (ByteString)
 import qualified Data.ByteString as B
-import Data.List (foldl')
 import Data.OrdPSQ (OrdPSQ)
 import qualified Data.OrdPSQ as PSQ
 import Data.Time (UTCTime, getCurrentTime)
 
+import Network.DNS.Imports
 import Network.DNS.Types
 
 data Section = Answer | Authority deriving (Eq, Ord, Show)
diff --git a/Network/DNS/Resolver.hs b/Network/DNS/Resolver.hs
--- a/Network/DNS/Resolver.hs
+++ b/Network/DNS/Resolver.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE BangPatterns #-}
@@ -41,38 +40,29 @@
 #define GHC708
 #endif
 
-import qualified Data.ByteString as BS
 import Control.Exception as E
-import Control.Monad (forM, replicateM)
-import Data.Maybe (isJust, maybe)
 import qualified Crypto.Random as C
+import qualified Data.ByteString as BS
 import Data.IORef (IORef)
 import qualified Data.IORef as I
-import Data.List.NonEmpty (NonEmpty(..))
 import qualified Data.List.NonEmpty as NE
-import Data.Word (Word16)
-import Network.BSD (getProtocolNumber)
-import Network.DNS.Transport
-import Network.DNS.Types
-import Network.DNS.Types.Internal
-import Network.DNS.Memo
-import Network.Socket (AddrInfoFlag(..), AddrInfo(..), PortNumber(..), HostName, SocketType(Datagram), getAddrInfo, defaultHints)
+import Network.Socket (AddrInfoFlag(..), AddrInfo(..), PortNumber, HostName, SocketType(Datagram), getAddrInfo, defaultHints)
 import Prelude hiding (lookup)
 
-#ifdef GHC708
-import Control.Applicative ((<$>), (<*>), pure)
-#endif
-
 #if defined(WIN)
 import qualified Data.List.Split as Split
 import Foreign.C.String
 import Foreign.Marshal.Alloc (allocaBytes)
-import Data.Word
 #else
 import Data.Char (isSpace)
-import Data.List (isPrefixOf)
 #endif
 
+import Network.DNS.Imports
+import Network.DNS.Memo
+import Network.DNS.Transport
+import Network.DNS.Types
+import Network.DNS.Types.Internal
+
 ----------------------------------------------------------------
 
 -- |  Make a 'ResolvSeed' from a 'ResolvConf'.
@@ -116,12 +106,10 @@
 
 makeAddrInfo :: HostName -> Maybe PortNumber -> IO AddrInfo
 makeAddrInfo addr mport = do
-    proto <- getProtocolNumber "udp"
-    let flags = [AI_ADDRCONFIG, AI_NUMERICHOST, AI_PASSIVE]
+    let flgs = [AI_ADDRCONFIG, AI_NUMERICHOST, AI_PASSIVE]
         hints = defaultHints {
-            addrFlags = if isJust mport then AI_NUMERICSERV : flags else flags
+            addrFlags = if isJust mport then AI_NUMERICSERV : flgs else flgs
           , addrSocketType = Datagram
-          , addrProtocol = proto
           }
         serv = maybe "domain" show mport
     head <$> getAddrInfo (Just hints) (Just addr) (Just serv)
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,4 @@
-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, CPP #-}
+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
 module Network.DNS.StateBinary (
     PState(..)
   , initialState
@@ -34,9 +34,7 @@
 import Control.Monad.State (State, StateT)
 import qualified Control.Monad.State as ST
 import qualified Data.Attoparsec.ByteString as A
-
 import qualified Data.Attoparsec.Types as T
-import Data.ByteString (ByteString)
 import qualified Data.ByteString as BS
 import Data.ByteString.Builder (Builder)
 import qualified Data.ByteString.Builder as BB
@@ -45,13 +43,9 @@
 import qualified Data.IntMap as IM
 import Data.Map (Map)
 import qualified Data.Map as M
-import Data.Word (Word8, Word16, Word32)
-import Network.DNS.Types
 
-#if __GLASGOW_HASKELL__ < 709
-import Control.Applicative ((<$>), (<*))
-import Data.Monoid (Monoid, mconcat, mappend, mempty)
-#endif
+import Network.DNS.Imports
+import Network.DNS.Types
 
 ----------------------------------------------------------------
 
diff --git a/Network/DNS/Transport.hs b/Network/DNS/Transport.hs
--- a/Network/DNS/Transport.hs
+++ b/Network/DNS/Transport.hs
@@ -10,14 +10,15 @@
 import Control.Exception as E
 import qualified Data.ByteString.Char8 as BS
 import qualified Data.List.NonEmpty as NE
-import Data.Typeable
-import Network.DNS.IO
-import Network.DNS.Types
-import Network.DNS.Types.Internal
 import Network.Socket (AddrInfo(..), SockAddr(..), Family(AF_INET, AF_INET6), Socket, SocketType(Stream), close, socket, connect, defaultProtocol)
 import System.IO.Error (annotateIOError)
 import System.Timeout (timeout)
 
+import Network.DNS.IO
+import Network.DNS.Imports
+import Network.DNS.Types
+import Network.DNS.Types.Internal
+
 -- | Check response for a matching identifier.  If we ever do pipelined TCP,
 -- we'll also need to match the QNAME, CLASS and QTYPE.  See:
 -- https://tools.ietf.org/html/rfc7766#section-7
@@ -176,10 +177,10 @@
             sendVC vc qry
             receiveVC vc
         case mres of
-            Nothing  -> E.throwIO TimeoutExpired
+            Nothing                     -> E.throwIO TimeoutExpired
             Just res
                 | checkResp q ident res -> return res
-                | otherwise -> E.throwIO SequenceNumberMismatch
+                | otherwise             -> E.throwIO SequenceNumberMismatch
 
 ----------------------------------------------------------------
 
diff --git a/Network/DNS/Types.hs b/Network/DNS/Types.hs
--- a/Network/DNS/Types.hs
+++ b/Network/DNS/Types.hs
@@ -100,15 +100,13 @@
   ) where
 
 import Control.Exception (Exception, IOException)
-import Data.Bits ((.&.), (.|.), shiftR, shiftL, testBit, setBit)
-import Data.ByteString (ByteString)
 import qualified Data.ByteString.Base64 as B64 (encode)
 import qualified Data.ByteString.Char8 as BS
 import qualified Data.ByteString.Builder as L
 import qualified Data.ByteString.Lazy as L
 import Data.IP (IP, IPv4, IPv6)
-import Data.Typeable (Typeable)
-import Data.Word (Word8, Word16, Word32)
+
+import Network.DNS.Imports
 
 ----------------------------------------------------------------
 
diff --git a/Network/DNS/Types/Internal.hs b/Network/DNS/Types/Internal.hs
--- a/Network/DNS/Types/Internal.hs
+++ b/Network/DNS/Types/Internal.hs
@@ -1,9 +1,8 @@
 module Network.DNS.Types.Internal where
 
-import Data.List.NonEmpty (NonEmpty(..))
-import Network.Socket (AddrInfo(..), PortNumber(..), HostName)
-import Data.Word (Word16)
+import Network.Socket (AddrInfo(..), PortNumber, HostName)
 
+import Network.DNS.Imports
 import Network.DNS.Memo
 import Network.DNS.Types
 
diff --git a/Network/DNS/Utils.hs b/Network/DNS/Utils.hs
--- a/Network/DNS/Utils.hs
+++ b/Network/DNS/Utils.hs
@@ -12,9 +12,9 @@
   , map
   , null
   , pack )
-import Data.Char ( toLower )
+import Data.Char (toLower)
 
-import Network.DNS.Types ( Domain )
+import Network.DNS.Types (Domain)
 
 
 -- | Perform both 'normalizeCase' and 'normalizeRoot' on the given
diff --git a/dns.cabal b/dns.cabal
--- a/dns.cabal
+++ b/dns.cabal
@@ -1,5 +1,5 @@
 Name:                   dns
-Version:                3.0.0
+Version:                3.0.1
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
@@ -27,6 +27,7 @@
                         Network.DNS.Decode
                         Network.DNS.IO
   Other-Modules:        Network.DNS.Decode.Internal
+                        Network.DNS.Imports
                         Network.DNS.Memo
                         Network.DNS.StateBinary
                         Network.DNS.Transport
