diff --git a/product-isomorphic.cabal b/product-isomorphic.cabal
--- a/product-isomorphic.cabal
+++ b/product-isomorphic.cabal
@@ -1,5 +1,5 @@
 name:                product-isomorphic
-version:             0.0.1.0
+version:             0.0.2.0
 synopsis:            Weaken applicative functor on products
 description:         Weaken applicative functor which allows only product
                      construction. Product constructions and deconstructions
@@ -14,6 +14,12 @@
 build-type:          Simple
 -- extra-source-files:
 cabal-version:       >=1.10
+tested-with:           GHC == 8.2.1
+                     , GHC == 8.0.1, GHC == 8.0.2
+                     , GHC == 7.10.1, GHC == 7.10.2, GHC == 7.10.3
+                     , GHC == 7.8.1, GHC == 7.8.2, GHC == 7.8.3, GHC == 7.8.4
+                     , GHC == 7.6.1, GHC == 7.6.2, GHC == 7.6.3
+                     , GHC == 7.4.1, GHC == 7.4.2
 
 library
   exposed-modules:
diff --git a/src/Data/Functor/ProductIsomorphic/Class.hs b/src/Data/Functor/ProductIsomorphic/Class.hs
--- a/src/Data/Functor/ProductIsomorphic/Class.hs
+++ b/src/Data/Functor/ProductIsomorphic/Class.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 
 -- |
 -- Module      : Data.Functor.ProductIsomorphic.Class
@@ -11,13 +12,21 @@
 --
 -- This module defines functor interfaces which morphed functions
 -- are restricted to products.
-module Data.Functor.ProductIsomorphic.Class
-       ( ProductIsoFunctor (..)
-       , ProductIsoApplicative (..)
-       , ProductIsoAlternative (..)
-       ) where
+module Data.Functor.ProductIsomorphic.Class (
+  -- * ProductIso classes
+  ProductIsoFunctor (..),
+  ProductIsoApplicative (..),
+  ProductIsoAlternative (..),
 
+  -- * Empty element
+  ProductIsoEmpty (..),
+  peRightR, peLeftR,
+
+  --- (<|), (|>),
+  ) where
+
 import Data.Functor.ProductIsomorphic.Unsafe (ProductConstructor)
+import Data.Functor.ProductIsomorphic.TupleInstances ()
 
 -- | Restricted functor on products.
 class ProductIsoFunctor f where
@@ -35,3 +44,41 @@
 
 infixl 4 |$|, |*|
 infixl 3 |||
+
+-- | Empty element of product operator
+class ProductIsoApplicative f => ProductIsoEmpty f e where
+  pureE   :: f e
+  peRight :: f (a, e) -> f a
+  peLeft  :: f (e, a) -> f a
+
+-- | peRight and peRightR should have isomorphic law.
+-- @
+--   peRight . peRightR == peRightR . peRight == id
+-- @
+peRightR :: ProductIsoEmpty f e
+        => f a
+        -> f (a, e)
+peRightR p = (,) |$| p |*| pureE
+{-# INLINABLE peRightR #-}
+
+-- | peLeft and peLeftR should have isomorphic law.
+-- @
+--   peLeft . peLeftR == peLeftR . peLeft == id
+-- @
+peLeftR :: ProductIsoEmpty f e
+       => f a
+       -> f (e, a)
+peLeftR p = (,) |$| pureE |*| p
+{-# INLINABLE peLeftR #-}
+
+{-
+(<|) :: ProductIsoEmpty f e => f a -> f e -> f a
+p <| e = peRight $ (,) |$| p |*| e
+{-# INLINABLE (<|) #-}
+
+(|>) :: ProductIsoEmpty f e => f e -> f a -> f a
+e |> p = peLeft $ (,) |$| e |*| p
+{-# INLINABLE (|>) #-}
+
+infixl 4 <|, |>
+ -}
diff --git a/src/Data/Functor/ProductIsomorphic/Instances.hs b/src/Data/Functor/ProductIsomorphic/Instances.hs
--- a/src/Data/Functor/ProductIsomorphic/Instances.hs
+++ b/src/Data/Functor/ProductIsomorphic/Instances.hs
@@ -1,4 +1,5 @@
 {-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 
 -- |
 -- Module      : Data.Functor.ProductIsomorphic.Instances
@@ -23,7 +24,8 @@
    Const (..))
 
 import Data.Functor.ProductIsomorphic.Class
-  (ProductIsoFunctor(..), ProductIsoApplicative (..), ProductIsoAlternative (..))
+  (ProductIsoFunctor(..), ProductIsoApplicative (..),
+   ProductIsoAlternative (..), ProductIsoEmpty (..))
 
 
 instance ProductIsoFunctor (Const a) where
@@ -36,7 +38,15 @@
   Const a |*| Const b = Const $ a <> b
   {-# INLINABLE (|*|) #-}
 
+instance Monoid a => ProductIsoEmpty (Const a) () where
+  pureE = pureP ()
+  {-# INLINABLE pureE #-}
+  peRight (Const a) = Const a
+  {-# INLINABLE peRight #-}
+  peLeft (Const a) = Const a
+  {-# INLINABLE peLeft #-}
 
+
 -- | Wrapped functor type to make instances of product-iso functors.
 newtype WrappedFunctor f a = WrapFunctor { unwrapFunctor :: f a }
 
@@ -56,7 +66,15 @@
   WrapFunctor fa1 ||| WrapFunctor fa2 = WrapFunctor $ fa1 <|> fa2
   {-# INLINABLE (|||) #-}
 
+instance Applicative f => ProductIsoEmpty (WrappedFunctor f) () where
+  pureE   = pureP ()
+  {-# INLINABLE pureE #-}
+  peRight = WrapFunctor . fmap fst . unwrapFunctor
+  {-# INLINABLE peRight #-}
+  peLeft  = WrapFunctor . fmap snd . unwrapFunctor
+  {-# INLINABLE peLeft #-}
 
+
 -- | Wrapped Const Alternative objects to make instances like Const functor.
 newtype WrappedAlter f a b = WrapAlter { unWrapAlter :: Const (f a) b }
 
@@ -69,3 +87,10 @@
   {-# INLINABLE pureP #-}
   WrapAlter (Const a) |*| WrapAlter (Const b) = WrapAlter $ Const $ a <|> b
   {-# INLINABLE (|*|) #-}
+
+instance Alternative f => ProductIsoEmpty (WrappedAlter f a) () where
+  pureE   = pureP ()
+  {-# INLINABLE pureE #-}
+  peRight = WrapAlter . fmap fst . unWrapAlter
+  {-# INLINABLE peRight #-}
+  peLeft  = WrapAlter . fmap snd . unWrapAlter
diff --git a/src/Data/Functor/ProductIsomorphic/TupleInstances.hs b/src/Data/Functor/ProductIsomorphic/TupleInstances.hs
--- a/src/Data/Functor/ProductIsomorphic/TupleInstances.hs
+++ b/src/Data/Functor/ProductIsomorphic/TupleInstances.hs
@@ -16,8 +16,12 @@
 
 import Control.Applicative ((<$>))
 
+import Data.Functor.ProductIsomorphic.Unsafe (ProductConstructor (..))
 import Data.Functor.ProductIsomorphic.TH.Internal
   (defineTupleProductConstructor)
 
+
+instance ProductConstructor () where
+  productConstructor = ()
 
 $(concat <$> mapM defineTupleProductConstructor [2..7])
