diff --git a/llvm-extra.cabal b/llvm-extra.cabal
--- a/llvm-extra.cabal
+++ b/llvm-extra.cabal
@@ -1,6 +1,6 @@
 Cabal-Version:  2.2
 Name:           llvm-extra
-Version:        0.11
+Version:        0.12
 License:        BSD-3-Clause
 License-File:   LICENSE
 Author:         Henning Thielemann <haskell@henning-thielemann.de>
@@ -61,7 +61,7 @@
   default:     False
 
 Source-Repository this
-  Tag:         0.11
+  Tag:         0.12
   Type:        darcs
   Location:    http://code.haskell.org/~thielema/llvm-extra/
 
@@ -72,7 +72,7 @@
 Library
   Build-Depends:
     private,
-    llvm-tf >=12.1 && <13.0,
+    llvm-tf >=12.1 && <17.1,
     tfp >=1.0 && <1.1,
     non-empty >=0.2.1 && <0.4,
     fixed-length >=0.2.1 && <0.3,
diff --git a/private/LLVM/Extra/ArithmeticPrivate.hs b/private/LLVM/Extra/ArithmeticPrivate.hs
--- a/private/LLVM/Extra/ArithmeticPrivate.hs
+++ b/private/LLVM/Extra/ArithmeticPrivate.hs
@@ -39,12 +39,14 @@
 dec x = sub x (valueOf 1)
 
 advanceArrayElementPtr ::
+   (LLVM.IsType a) =>
    Value (LLVM.Ptr a) ->
    CodeGenFunction r (Value (LLVM.Ptr a))
 advanceArrayElementPtr p =
    getElementPtr p (valueOf 1 :: Value Word32, ())
 
 decreaseArrayElementPtr ::
+   (LLVM.IsType a) =>
    Value (LLVM.Ptr a) ->
    CodeGenFunction r (Value (LLVM.Ptr a))
 decreaseArrayElementPtr p =
diff --git a/src/LLVM/Extra/Arithmetic.hs b/src/LLVM/Extra/Arithmetic.hs
--- a/src/LLVM/Extra/Arithmetic.hs
+++ b/src/LLVM/Extra/Arithmetic.hs
@@ -71,11 +71,11 @@
    sub = LLVM.sub
    neg = LLVM.neg
 
-instance (IsArithmetic a) => Additive (ConstValue a) where
+instance (IsInteger a) => Additive (ConstValue a) where
    zero = LLVM.zero
-   add = LLVM.add
-   sub = LLVM.sub
-   neg = sub LLVM.zero
+   add = LLVM.iadd
+   sub = LLVM.isub
+   neg = LLVM.isub LLVM.zero
 
 instance (Additive a, Additive b) => Additive (a,b) where
    zero = (zero, zero)
@@ -102,8 +102,8 @@
 instance (IsArithmetic v) => PseudoRing (Value v) where
    mul = LLVM.mul
 
-instance (IsArithmetic v) => PseudoRing (ConstValue v) where
-   mul = LLVM.mul
+instance (IsInteger v) => PseudoRing (ConstValue v) where
+   mul = LLVM.imul
 
 
 type family Scalar vector
@@ -116,10 +116,7 @@
 instance (SoV.PseudoModule v) => PseudoModule (Value v) where
    scale = SoV.scale
 
-instance (SoV.PseudoModule v) => PseudoModule (ConstValue v) where
-   scale = SoV.scaleConst
 
-
 class IntegerConstant a where
    fromInteger' :: Integer -> a
 
@@ -159,9 +156,6 @@
    fdiv :: a -> a -> CodeGenFunction r a
 
 instance (LLVM.IsFloating v) => Field (Value v) where
-   fdiv = LLVM.fdiv
-
-instance (LLVM.IsFloating v) => Field (ConstValue v) where
    fdiv = LLVM.fdiv
 
 
diff --git a/src/LLVM/Extra/Memory.hs b/src/LLVM/Extra/Memory.hs
--- a/src/LLVM/Extra/Memory.hs
+++ b/src/LLVM/Extra/Memory.hs
@@ -117,7 +117,7 @@
    }
 
 element ::
-   (C x,
+   (C x, IsType o,
     LLVM.GetValue o n, LLVM.ValueType o n ~ Struct x,
     LLVM.GetElementPtr o (n, ()), LLVM.ElementPtrType o (n, ()) ~ Struct x) =>
    (v -> x) -> n -> Element r o v x
diff --git a/src/LLVM/Extra/ScalarOrVector.hs b/src/LLVM/Extra/ScalarOrVector.hs
--- a/src/LLVM/Extra/ScalarOrVector.hs
+++ b/src/LLVM/Extra/ScalarOrVector.hs
@@ -26,7 +26,7 @@
    replicateOf,
    Real (min, max, abs, signum),
    Saturated(addSat, subSat),
-   PseudoModule (scale, scaleConst),
+   PseudoModule (scale),
    IntegerConstant(constFromInteger),
    RationalConstant(constFromRational),
    TranscendentalConstant(constPi),
@@ -307,24 +307,22 @@
    (LLVM.IsArithmetic (Scalar v), LLVM.IsArithmetic v) =>
       PseudoModule v where
    scale :: (a ~ Scalar v) => Value a -> Value v -> CodeGenFunction r (Value v)
-   scaleConst :: (a ~ Scalar v) => ConstValue a -> ConstValue v -> CodeGenFunction r (ConstValue v)
 
-instance PseudoModule Word   where scale = LLVM.mul; scaleConst = LLVM.mul
-instance PseudoModule Word8  where scale = LLVM.mul; scaleConst = LLVM.mul
-instance PseudoModule Word16 where scale = LLVM.mul; scaleConst = LLVM.mul
-instance PseudoModule Word32 where scale = LLVM.mul; scaleConst = LLVM.mul
-instance PseudoModule Word64 where scale = LLVM.mul; scaleConst = LLVM.mul
-instance PseudoModule Int    where scale = LLVM.mul; scaleConst = LLVM.mul
-instance PseudoModule Int8   where scale = LLVM.mul; scaleConst = LLVM.mul
-instance PseudoModule Int16  where scale = LLVM.mul; scaleConst = LLVM.mul
-instance PseudoModule Int32  where scale = LLVM.mul; scaleConst = LLVM.mul
-instance PseudoModule Int64  where scale = LLVM.mul; scaleConst = LLVM.mul
-instance PseudoModule Float  where scale = LLVM.mul; scaleConst = LLVM.mul
-instance PseudoModule Double where scale = LLVM.mul; scaleConst = LLVM.mul
+instance PseudoModule Word   where scale = LLVM.mul
+instance PseudoModule Word8  where scale = LLVM.mul
+instance PseudoModule Word16 where scale = LLVM.mul
+instance PseudoModule Word32 where scale = LLVM.mul
+instance PseudoModule Word64 where scale = LLVM.mul
+instance PseudoModule Int    where scale = LLVM.mul
+instance PseudoModule Int8   where scale = LLVM.mul
+instance PseudoModule Int16  where scale = LLVM.mul
+instance PseudoModule Int32  where scale = LLVM.mul
+instance PseudoModule Int64  where scale = LLVM.mul
+instance PseudoModule Float  where scale = LLVM.mul
+instance PseudoModule Double where scale = LLVM.mul
 instance (LLVM.IsArithmetic a, LLVM.IsPrimitive a, TypeNum.Positive n) =>
          PseudoModule (Vector n a) where
    scale a v = flip A.mul v =<< replicate a
-   scaleConst a v = LLVM.mul (replicateConst a `asTypeOf` v) v
 
 
 
