diff --git a/src/lib/Data/Variant.hs b/src/lib/Data/Variant.hs
--- a/src/lib/Data/Variant.hs
+++ b/src/lib/Data/Variant.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE KindSignatures #-}
 {-# LANGUAGE TypeOperators #-}
@@ -326,6 +327,7 @@
 {-# INLINABLE toVariantHead #-}
 toVariantHead a = Variant 0 (unsafeCoerce a)
 
+#if MIN_VERSION_base(4,18,0)
 -- | Set the tail
 --
 -- >>> let x = V @Int 10 :: V [Int,String,Float]
@@ -333,6 +335,15 @@
 -- >>> :t y
 -- y :: V [Double, Int, String, Float]
 --
+#else
+-- | Set the tail
+--
+-- >>> let x = V @Int 10 :: V [Int,String,Float]
+-- >>> let y = toVariantTail @Double x
+-- >>> :t y
+-- y :: V '[Double, Int, String, Float]
+--
+#endif
 toVariantTail :: forall x xs. V xs -> V (x ': xs)
 {-# INLINABLE toVariantTail #-}
 toVariantTail (Variant t a) = Variant (t+1) a
@@ -424,6 +435,7 @@
       Nothing -> Variant t a
       Just x  -> Variant t (unsafeCoerce (f x))
 
+#if MIN_VERSION_base(4,18,0)
 -- | Applicative update of a single variant value by index
 --
 -- Example with `Maybe`:
@@ -451,10 +463,43 @@
 -- v :: V [Int, (), Float]
 --
 -- >>> v <- mapVariantAtM @2 print x
--- 
+--
 -- >>> :t v
 -- v :: V [Int, [Char], ()]
 --
+#else
+-- | Applicative update of a single variant value by index
+--
+-- Example with `Maybe`:
+--
+-- >>> let f s = if s == "Test" then Just (42 :: Word) else Nothing
+-- >>> let x = V @String "Test" :: V [Int,String,Float]
+-- >>> mapVariantAtM @1 f x
+-- Just 42
+--
+-- >>> let y = V @String "NotTest" :: V [Int,String,Float]
+-- >>> mapVariantAtM @1 f y
+-- Nothing
+--
+-- Example with `IO`:
+--
+-- >>> v <- mapVariantAtM @0 print x
+--
+-- >>> :t v
+-- v :: V '[(), String, Float]
+--
+-- >>> v <- mapVariantAtM @1 print x
+-- "Test"
+--
+-- >>> :t v
+-- v :: V '[Int, (), Float]
+--
+-- >>> v <- mapVariantAtM @2 print x
+--
+-- >>> :t v
+-- v :: V '[Int, [Char], ()]
+--
+#endif
 mapVariantAtM :: forall (n :: Nat) a b l m .
    ( KnownNat n
    , Applicative m
diff --git a/src/lib/Data/Variant/EGADT.hs b/src/lib/Data/Variant/EGADT.hs
--- a/src/lib/Data/Variant/EGADT.hs
+++ b/src/lib/Data/Variant/EGADT.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE KindSignatures #-}
@@ -25,6 +26,7 @@
 import Data.Variant.Types
 import Data.Variant.Functor
 
+#if MIN_VERSION_base(4,18,0)
 -- $setup
 -- >>> :seti -XDataKinds
 -- >>> :seti -XTypeApplications
@@ -40,7 +42,7 @@
 -- >>> :{
 -- >>> data LamF (ast :: Type -> Type) t where
 -- >>>   LamF :: ( ast a -> ast b ) -> LamF ast ( a -> b )
--- >>> 
+-- >>>
 -- >>> data AppF ast t where
 -- >>>   AppF :: ast ( a -> b ) -> ast a -> AppF ast b
 -- >>>
@@ -71,7 +73,55 @@
 -- >>> let z = VF (AppF (VF (LamF f)) (VF (VarF "a")))
 -- >>> :t z
 -- z :: EGADT [LamF, AppF, VarF] Int
+
+#else
+-- $setup
+-- >>> :seti -XDataKinds
+-- >>> :seti -XTypeApplications
+-- >>> :seti -XTypeOperators
+-- >>> :seti -XFlexibleContexts
+-- >>> :seti -XTypeFamilies
+-- >>> :seti -XPatternSynonyms
+-- >>> :seti -XDeriveFunctor
+-- >>> :seti -XGADTs
+-- >>> :seti -XPolyKinds
+-- >>> :seti -XPartialTypeSignatures
+-- >>>
+-- >>> :{
+-- >>> data LamF (ast :: Type -> Type) t where
+-- >>>   LamF :: ( ast a -> ast b ) -> LamF ast ( a -> b )
+-- >>>
+-- >>> data AppF ast t where
+-- >>>   AppF :: ast ( a -> b ) -> ast a -> AppF ast b
+-- >>>
+-- >>> data VarF ast t where
+-- >>>   VarF :: String -> VarF ast Int
+-- >>>
+-- >>> type AST a = EGADT '[LamF,AppF,VarF] a
+-- >>>
+-- >>> :}
 --
+-- >>> let y = VF @(AST Int) (VarF "a")
+-- >>> :t y
+-- y :: EGADT '[LamF, AppF, VarF] Int
+--
+-- >>> :{
+-- >>> case y of
+-- >>>   VF (VarF x) -> print x
+-- >>>   _           -> putStrLn "Not a VarF"
+-- >>> :}
+-- "a"
+--
+-- >>> :{
+-- >>> f :: AST Int -> AST Int
+-- >>> f (VF (VarF x)) = VF (VarF "zz")
+-- >>> f _             = error "Unhandled case"
+-- >>> :}
+--
+-- >>> let z = VF (AppF (VF (LamF f)) (VF (VarF "a")))
+-- >>> :t z
+-- z :: EGADT '[LamF, AppF, VarF] Int
+#endif
 
 
 -- | An EADT with an additional type parameter
diff --git a/src/lib/Data/Variant/Excepts.hs b/src/lib/Data/Variant/Excepts.hs
--- a/src/lib/Data/Variant/Excepts.hs
+++ b/src/lib/Data/Variant/Excepts.hs
@@ -10,7 +10,6 @@
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE AllowAmbiguousTypes #-}
-{-# LANGUAGE BlockArguments #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
@@ -178,8 +177,8 @@
 #if MIN_VERSION_base(4,12,0)
 instance (MonadFail m) => MonadFail (Excepts es m) where
 #endif
-   {-# INLINABLE fail #-}
-   fail = Excepts . fail
+    {-# INLINABLE fail #-}
+    fail = Excepts . fail
 
 instance MonadTrans (Excepts e) where
     {-# INLINABLE lift #-}
@@ -401,7 +400,7 @@
    ( KnownNat (Length (b:e2))
    , Monad m
    ) => (forall x y. m x -> m y -> m (x,y)) -> Excepts e1 m a -> Excepts e2 m b -> Excepts (Tail (Product (a:e1) (b:e2))) m (a,b)
-runBothE exec f g = Excepts do
+runBothE exec f g = Excepts $ do
    (v1,v2) <- exec (runE f) (runE g)
    pure (veitherProduct v1 v2)
 
diff --git a/src/lib/Data/Variant/Tuple.hs b/src/lib/Data/Variant/Tuple.hs
--- a/src/lib/Data/Variant/Tuple.hs
+++ b/src/lib/Data/Variant/Tuple.hs
@@ -19,6 +19,10 @@
 {-# LANGUAGE StandaloneKindSignatures #-}
 #endif
 
+#if !MIN_VERSION_GLASGOW_HASKELL(8,6,0,0)
+{-# LANGUAGE TypeInType #-}
+#endif
+
 -- | Tuple helpers
 module Data.Variant.Tuple
    ( uncurry3
diff --git a/variant.cabal b/variant.cabal
--- a/variant.cabal
+++ b/variant.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.4
 name:                variant
-version:             1.0
+version:             1.0.1
 synopsis:            Variant and EADT
 license:             BSD-3-Clause
 license-file:        LICENSE
