diff --git a/Algebra.hs b/Algebra.hs
--- a/Algebra.hs
+++ b/Algebra.hs
@@ -13,13 +13,65 @@
 import Data.Monoid hiding ((<>))
 import Data.Proxy
 import Data.Semigroup
-import Prelude (Integer)
+import Data.Word
+import Numeric.Natural
+import Prelude (Int, Integer)
 import qualified Prelude as Base
 
 class Semigroup a => Abelian a
 
+instance Abelian ()
+instance (Abelian a, Abelian b) => Abelian (a, b) where
+instance (Abelian a, Abelian b, Abelian c) => Abelian (a, b, c) where
+instance (Abelian a, Abelian b, Abelian c, Abelian d) => Abelian (a, b, c, d) where
+instance (Abelian a, Abelian b, Abelian c, Abelian d, Abelian e) => Abelian (a, b, c, d, e) where
+
+instance Abelian a => Abelian (Identity a)
+instance Abelian a => Abelian (Dual a)
+instance Abelian (Proxy a)
+instance Abelian a => Abelian (Const a b)
+instance Abelian b => Abelian (a -> b)
+
+instance Abelian (Sum Natural)
+instance Abelian (Sum Integer)
+instance Abelian (Sum Word)
+instance Abelian (Sum Int)
+
+instance Abelian (Product Natural)
+instance Abelian (Product Integer)
+instance Abelian (Product Word)
+instance Abelian (Product Int)
+
+instance Abelian (Min Natural)
+instance Abelian (Min Integer)
+instance Abelian (Min Word)
+instance Abelian (Min Int)
+
+instance Abelian (Max Natural)
+instance Abelian (Max Integer)
+instance Abelian (Max Word)
+instance Abelian (Max Int)
+
+instance Abelian All
+instance Abelian Any
+
 class Semigroup a => Idempotent a
 
+instance Idempotent ()
+instance (Idempotent a, Idempotent b) => Idempotent (a, b) where
+instance (Idempotent a, Idempotent b, Idempotent c) => Idempotent (a, b, c) where
+instance (Idempotent a, Idempotent b, Idempotent c, Idempotent d) => Idempotent (a, b, c, d) where
+instance (Idempotent a, Idempotent b, Idempotent c, Idempotent d, Idempotent e) => Idempotent (a, b, c, d, e) where
+
+instance Idempotent a => Idempotent (Identity a)
+instance Idempotent a => Idempotent (Dual a)
+instance Idempotent (Proxy a)
+instance Idempotent a => Idempotent (Const a b)
+instance Idempotent b => Idempotent (a -> b)
+
+instance Base.Ord a => Idempotent (Min a)
+instance Base.Ord a => Idempotent (Max a)
+
 class Monoid a => Group a where
     invert :: a -> a
 
@@ -48,9 +100,9 @@
 
 instance Group b => Group (a -> b) where invert = (.) invert
 
-instance Group a => Group (Base.IO a) where invert = fmap invert
-
 instance Group (Sum Integer) where invert (Sum a) = Sum (Base.negate a)
+instance Group (Sum Int) where invert (Sum a) = Sum (Base.negate a)
+instance Group (Sum Word) where invert (Sum a) = Sum (Base.negate a)
 
 (+) :: Semigroup (Sum a) => a -> a -> a
 a + b = getSum (Sum a <> Sum b)
diff --git a/alg.cabal b/alg.cabal
--- a/alg.cabal
+++ b/alg.cabal
@@ -1,5 +1,5 @@
 name:                alg
-version:             0.1.1.1
+version:             0.2.0.0
 synopsis:            Algebraic structures
 -- description:         
 license:             BSD3
