diff --git a/imap.cabal b/imap.cabal
--- a/imap.cabal
+++ b/imap.cabal
@@ -2,7 +2,7 @@
 -- see http://haskell.org/cabal/users-guide/
 
 name:                imap
-version:             0.3.0.6
+version:             0.3.0.7
 synopsis:            An efficient IMAP client library, with SSL and streaming
 license:             BSD3
 license-file:        LICENSE
@@ -106,7 +106,7 @@
     Network.IMAP.Utils
   -- other-modules:
   -- other-extensions:
-  build-depends:        base == 4.10.*,
+  build-depends:        base >= 4.10 && <4.12,
                         attoparsec == 0.13.*,
                         text == 1.2.*,
                         connection == 0.2.*,
@@ -115,11 +115,10 @@
                         word8 == 0.1.* && <0.2,
                         rolling-queue == 0.1,
                         stm == 2.4.* && <2.5,
-                        either ==  4.5.*,
+                        either >= 4.5 && <6,
                         hslogger == 1.2.*,
                         transformers == 0.5.*,
-                        list-t == 1.0.0.*,
-                        derive == 2.6.*,
+                        list-t == 1.0.*,
                         stm-delay == 0.1.*,
                         exceptions == 0.8.*,
                         pipes == 4.3.*,
diff --git a/src/Network/IMAP/Types.hs b/src/Network/IMAP/Types.hs
--- a/src/Network/IMAP/Types.hs
+++ b/src/Network/IMAP/Types.hs
@@ -4,7 +4,7 @@
 import qualified Data.ByteString.Char8 as BSC
 import qualified Data.STM.RollingQueue as RQ
 import Control.Concurrent.STM.TVar (TVar)
-import Data.DeriveTH
+-- import Data.DeriveTH
 
 import Control.Concurrent (ThreadId)
 import Control.Concurrent.STM.TQueue (TQueue)
@@ -26,6 +26,12 @@
                      | Disconnected
                      deriving (Show)
 
+isUndefinedState, isConnected, isDisconnected :: ConnectionState -> Bool
+
+isUndefinedState UndefinedState = True; isUndefinedState _ = False
+isConnected Connected = True; isConnected _ = False
+isDisconnected Disconnected = True; isDisconnected _ = False
+
 data IMAPConnection = IMAPConnection {
   -- |The current connection state
   connectionState :: TVar ConnectionState,
@@ -86,6 +92,16 @@
           | FOther T.Text
   deriving (Show, Eq, Ord)
 
+isFOther, isFAny, isFRecent, isFDraft, isFDeleted, isFFlagged, isFAnswered, isFSeen :: Flag -> Bool
+isFOther (FOther _) = True; isFOther _ = False
+isFAny FAny = True; isFAny _ = False
+isFRecent FRecent = True; isFRecent _ = False
+isFDraft FDraft = True; isFDraft _ = False
+isFDeleted FDeleted = True; isFDeleted _ = False
+isFFlagged FFlagged = True; isFFlagged _ = False
+isFAnswered FAnswered = True; isFAnswered _ = False
+isFSeen FSeen = True; isFSeen _ = False
+
 data Capability = CIMAP4
                 | CUnselect
                 | CIdle
@@ -181,6 +197,41 @@
                     | Extension BSC.ByteString ExtensionPayload -- ^ A format extension
                     deriving (Show, Eq)
 
+isFlags, isExists, isExpunge, isBye, isHighestModSeq, isRecent, isMessages :: UntaggedResult -> Bool
+isUnseen, isPermanentFlags, isUID, isMessageId, isUIDNext, isUIDValidity :: UntaggedResult -> Bool
+isOKResult, isNOResult, isBADResult, isCapabilities, isListR, isFetch :: UntaggedResult -> Bool
+isStatusR, isSearch, isEnvelope, isInternalDate, isSize, isUnknown :: UntaggedResult -> Bool
+isBody, isBodyStructure, isExtension :: UntaggedResult -> Bool
+
+isFlags (Flags _) = True; isFlags _ = False
+isExists (Exists{}) = True; isExists _ = False
+isExpunge (Expunge _) = True; isExpunge _ = False
+isBye Bye = True; isBye _ = False
+isHighestModSeq (HighestModSeq _) = True; isHighestModSeq _ = False
+isRecent (Recent _) = True; isRecent _ = False
+isMessages (Messages _) = True; isMessages _ = False
+isUnseen (Unseen _) = True; isUnseen _ = False
+isPermanentFlags (PermanentFlags _) = True; isPermanentFlags _ = False
+isUID (UID _) = True; isUID _ = False
+isMessageId (MessageId _) = True; isMessageId _ = False
+isUIDNext (UIDNext _) = True; isUIDNext _ = False
+isUIDValidity (UIDValidity _) = True; isUIDValidity _ = False
+isOKResult (OKResult _) = True; isOKResult _ = False
+isNOResult (NOResult _) = True; isNOResult _ = False
+isBADResult (BADResult _) = True; isBADResult _ = False
+isCapabilities (Capabilities _) = True; isCapabilities _ = False
+isListR (ListR{}) = True; isListR _ = False
+isFetch (Fetch{}) = True; isFetch _ = False
+isStatusR (StatusR{}) = True; isStatusR _ = False
+isSearch (Search{}) = True; isSearch _ = False
+isEnvelope (Envelope{}) = True; isEnvelope _ = False
+isInternalDate (InternalDate{}) = True; isInternalDate _ = False
+isSize (Size{}) = True; isSize _ = False
+isUnknown (Unknown{}) = True; isUnknown _ = False
+isBody  (Unknown{}) = True; isBody _ = False
+isBodyStructure  (Unknown{}) = True; isBodyStructure _ = False
+isExtension  (Unknown{}) = True; isExtension _ = False
+
 data ExtensionPayload = ExtInt Integer | ExtLabels [BSC.ByteString]
   deriving (Show, Eq)
 
@@ -198,6 +249,12 @@
 data CommandResult = Tagged TaggedResult | Untagged UntaggedResult
   deriving (Show, Eq)
 
+isTagged, isUntagged :: CommandResult -> Bool
+isTagged (Tagged{}) = True; isTagged _ = False
+isUntagged (Untagged{}) = True; isUntagged _ = False
+
+
+
 -- |If you don't care about streaming you will get results in this simplified
 --  data type, in which the ErrorMessage comes from TaggedResult if it failed.
 type SimpleResult = Either ErrorMessage [UntaggedResult]
@@ -223,7 +280,4 @@
 defaultImapSettings :: IMAPSettings
 defaultImapSettings = IMAPSettings 30 10
 
-$(derive makeIs ''Flag)
-$(derive makeIs ''UntaggedResult)
-$(derive makeIs ''CommandResult)
-$(derive makeIs ''ConnectionState)
+
