diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,7 @@
+2023-02-21 Ivan Perez <ivan.perez@keera.co.uk>
+        * Version bump (0.10.0) (#342).
+        * Implement dot in MSF's instance of VectorSpace (#298).
+
 2022-12-21 Ivan Perez <ivan.perez@keera.co.uk>
         * Version bump (0.9.2) (#340).
         * Bump version bounds for MonadRandom (#337).
diff --git a/dunai.cabal b/dunai.cabal
--- a/dunai.cabal
+++ b/dunai.cabal
@@ -30,7 +30,7 @@
 build-type:    Simple
 
 name:          dunai
-version:       0.9.2
+version:       0.10.0
 author:        Ivan Perez, Manuel Bärenz
 maintainer:    ivan.perez@keera.co.uk
 homepage:      https://github.com/ivanperez-keera/dunai
diff --git a/src/Data/MonadicStreamFunction/Instances/VectorSpace.hs b/src/Data/MonadicStreamFunction/Instances/VectorSpace.hs
--- a/src/Data/MonadicStreamFunction/Instances/VectorSpace.hs
+++ b/src/Data/MonadicStreamFunction/Instances/VectorSpace.hs
@@ -43,12 +43,18 @@
 import Data.MonadicStreamFunction.Core (MSF)
 
 -- | Vector-space instance for 'MSF's.
-instance (Monad m, VectorSpace v s, Eq s, Floating s)
-      => VectorSpace (MSF m a v) s
+instance (Monad m, Eq s, Num s, VectorSpace v s, Floating (MSF m a s))
+      => VectorSpace (MSF m a v) (MSF m a s)
   where
     zeroVector   = constantly zeroVector
-    r *^ msf     = msf >>^ (r *^)
-    msf ^/ r     = msf >>^ (^/ r)
+    (*^)         = elementwise2 (*^)
+    (^/)         = elementwise2 (^/)
     (^+^)        = elementwise2 (^+^)
     (^-^)        = elementwise2 (^-^)
     negateVector = (>>^ negateVector)
+    dot          = elementwise2 dot
+    normalize v  = elementwise2 f v (norm v)
+      where
+        f v' nv'
+          | nv' /= 0  = v' ^/ nv'
+          | otherwise = error "normalize: zero vector"
