diff --git a/haskus-utils-variant.cabal b/haskus-utils-variant.cabal
--- a/haskus-utils-variant.cabal
+++ b/haskus-utils-variant.cabal
@@ -1,5 +1,5 @@
 name:                haskus-utils-variant
-version:             3.3
+version:             3.4
 synopsis:            Variant and EADT
 license:             BSD3
 license-file:        LICENSE
@@ -19,6 +19,11 @@
   type: git
   location: git://github.com/haskus/packages.git
 
+flag unliftio
+  Description: Enable MonadUnliftIO instance
+  Manual: True
+  Default: True
+
 library
   exposed-modules:
     Haskus.Utils.ContFlow
@@ -42,6 +47,10 @@
    ,  haskus-utils-types        >= 1.5
    ,  haskus-utils-data         >= 1.2
    ,  mtl                       >= 2.2
+
+  if flag(unliftio)
+    build-depends: unliftio-core >= 0.2
+    cpp-options: -DENABLE_UNLIFTIO
 
   ghc-options:          -Wall
   default-language:     Haskell2010
diff --git a/src/lib/Haskus/Utils/Variant.hs b/src/lib/Haskus/Utils/Variant.hs
--- a/src/lib/Haskus/Utils/Variant.hs
+++ b/src/lib/Haskus/Utils/Variant.hs
@@ -112,6 +112,7 @@
 import GHC.Exts (Any)
 import Data.Typeable
 import Control.DeepSeq
+import Control.Exception
 
 import Haskus.Utils.Monad
 import Haskus.Utils.Types
@@ -271,6 +272,14 @@
    {-# INLINABLE showTypeList #-}
    showTypeList _ = showsPrec 0 (typeOf (undefined :: x)) : showTypeList (undefined :: V xs)
 
+instance Exception (V '[]) where
+
+instance
+   ( Exception x
+   , Typeable xs
+   , Exception (V xs)
+   ) => Exception (V (x ': xs))
+
 -- | Get Variant index
 --
 -- >>> let x = V "Test" :: V '[Int,String,Double]
@@ -614,8 +623,7 @@
 
 -- | A value of type "x" can be extracted from (V xs)
 type (:<) x xs =
-   ( CheckMember x xs
-   , Member x xs
+   ( Member x xs
    , x :<? xs
    )
 
@@ -669,7 +677,8 @@
 -- >>> fromVariant @Double x
 -- <BLANKLINE>
 -- ... error:
--- ... `Double' is not a member of '[Int, String, Int]
+-- ... Double not found in list:
+-- ... '[Int, String, Int]
 -- ...
 --
 fromVariant :: forall a xs.
diff --git a/src/lib/Haskus/Utils/Variant/Excepts.hs b/src/lib/Haskus/Utils/Variant/Excepts.hs
--- a/src/lib/Haskus/Utils/Variant/Excepts.hs
+++ b/src/lib/Haskus/Utils/Variant/Excepts.hs
@@ -61,6 +61,10 @@
 import qualified Control.Monad.Fail
 import           Control.Monad.Fail ( MonadFail )
 #endif
+#if defined(ENABLE_UNLIFTIO)
+import Control.Monad.IO.Unlift
+import qualified Control.Exception as E
+#endif
 
 newtype Excepts es m a = Excepts (m (VEither es a))
 
@@ -419,3 +423,12 @@
          v1 <- f
          v2 <- g
          pure (v1,v2)
+
+#if defined(ENABLE_UNLIFTIO)
+instance forall es m . (MonadCatch m, MonadUnliftIO m, Exception (V es)) => MonadUnliftIO (Excepts es m) where
+    withRunInIO exceptSToIO = Excepts $ fmap (either VLeft VRight) $ try $ do
+        withRunInIO $ \runInIO ->
+            exceptSToIO (runInIO . ((\case
+                                     VLeft v -> liftIO $ E.throwIO $ toException v
+                                     VRight a -> pure a) <=< runE))
+#endif
diff --git a/src/lib/Haskus/Utils/VariantF.hs b/src/lib/Haskus/Utils/VariantF.hs
--- a/src/lib/Haskus/Utils/VariantF.hs
+++ b/src/lib/Haskus/Utils/VariantF.hs
@@ -165,6 +165,7 @@
 instance
    ( Eq1 f
    , Eq1 (VariantF fs)
+   , ConstraintAll1 Eq1 fs
    ) => Eq1 (VariantF (f:fs)) where
    liftEq cmp x y = case (popVariantFHead x, popVariantFHead y) of
       (Right a, Right b) -> liftEq cmp a b
@@ -177,6 +178,8 @@
 instance
    ( Ord1 f
    , Ord1 (VariantF fs)
+   , ConstraintAll1 Eq1 fs
+   , ConstraintAll1 Ord1 fs
    ) => Ord1 (VariantF (f:fs)) where
    liftCompare cmp x@(VariantF v1) y@(VariantF v2) =
       case (popVariantFHead x, popVariantFHead y) of
@@ -191,6 +194,7 @@
 instance
    ( Show1 f
    , Show1 (VariantF fs)
+   , ConstraintAll1 Show1 fs
    ) => Show1 (VariantF (f:fs)) where
    liftShowsPrec shw shwl p x = case popVariantFHead x of
          Right a -> liftShowsPrec shw shwl p a
