diff --git a/CMakeLists.txt b/CMakeLists.txt
index a7bb4914ffe9e2117c2a9380baa31cdbd56ade50..43d10098f3d446202f12221184bd1d5c70722c33 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -141,6 +141,14 @@ SET(${PROJECT_NAME}_SOURCES
   ${${PROJECT_NAME}_DECOMPOSITIONS_SOURCES}
   src/exception.cpp
   src/eigenpy.cpp
+  src/matrix-float.cpp
+  src/matrix-complex-float.cpp
+  src/matrix-complex-double.cpp
+  src/matrix-double.cpp
+  src/matrix-long-double.cpp
+  src/matrix-complex-long-double.cpp
+  src/matrix-int.cpp
+  src/matrix-long.cpp
   src/angle-axis.cpp
   src/quaternion.cpp
   src/geometry-conversion.cpp
diff --git a/src/eigenpy.cpp b/src/eigenpy.cpp
index 9956e65804b0b0e296c5723f6ae6a1c1a2d61193..c85030b1ff9d87a689ec609635f5caba42f39fb5 100644
--- a/src/eigenpy.cpp
+++ b/src/eigenpy.cpp
@@ -6,38 +6,6 @@
 #include "eigenpy/eigenpy.hpp"
 #include <stdlib.h>
 
-namespace Eigen
-{
-  #define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)   \
-  /** \ingroup matrixtypedefs */                                    \
-  typedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix;  \
-  /** \ingroup matrixtypedefs */                                    \
-  typedef Matrix<Type, Size, 1>    Vector##SizeSuffix##TypeSuffix;  \
-  /** \ingroup matrixtypedefs */                                    \
-  typedef Matrix<Type, 1, Size>    RowVector##SizeSuffix##TypeSuffix;
-
-  #define EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, Size)         \
-  /** \ingroup matrixtypedefs */                                    \
-  typedef Matrix<Type, Size, Dynamic> Matrix##Size##X##TypeSuffix;  \
-  /** \ingroup matrixtypedefs */                                    \
-  typedef Matrix<Type, Dynamic, Size> Matrix##X##Size##TypeSuffix;
-
-  #define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \
-  EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \
-  EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \
-  EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \
-  EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \
-  EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \
-  EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \
-  EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 4)
-
-  EIGEN_MAKE_TYPEDEFS_ALL_SIZES(long double,               ld)
-  EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<long double>, cld)
-
-  #undef EIGEN_MAKE_TYPEDEFS_ALL_SIZES
-  #undef EIGEN_MAKE_TYPEDEFS
-  #undef EIGEN_MAKE_FIXED_TYPEDEFS
-}
 
 namespace eigenpy
 {
@@ -47,6 +15,16 @@ namespace eigenpy
     srand(seed_value);
   }
 
+  void exposeMatrixInt();
+  void exposeMatrixLong();
+  void exposeMatrixFloat();
+  void exposeMatrixDouble();
+  void exposeMatrixLongDouble();
+
+  void exposeMatrixComplexFloat();
+  void exposeMatrixComplexDouble();
+  void exposeMatrixComplexLongDouble();
+
   /* Enable Eigen-Numpy serialization for a set of standard MatrixBase instances. */
   void enableEigenPy()
   {
@@ -70,147 +48,15 @@ namespace eigenpy
     bp::def("seed",&seed,bp::arg("seed_value"),
             "Initialize the pseudo-random number generator with the argument seed_value.");
     
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2ld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2d);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2f);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2i);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2cf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2cd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2cld);
-    
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xi);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xcf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xcd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xcld);
-    
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3ld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3d);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3f);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3i);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3cf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3cd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3cld);
-    
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3Xd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3Xf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3Xi);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3Xcf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3Xcd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3Xcld);
-    
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4ld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4d);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4f);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4i);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4cf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4cd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4cld);
-    
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xi);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xcf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xcd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xcld);
-    
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2ld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2d);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2f);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2i);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2cf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2cd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2cld);
-    
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3ld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3d);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3f);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3i);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3cf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3cd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3cld);
-    
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4ld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4d);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4f);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4i);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4cf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4cd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4cld);
-    
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXi);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXcf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXcd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXcld);
-
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector2ld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector2d);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector2f);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector2i);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector2cf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector2cd);
-
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3ld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3d);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3f);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3i);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3cf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3cd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3cld);
-    
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4ld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4d);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4f);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4i);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4cf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4cd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4cld);
-    
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXi);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXcf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXcd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXcld);
-
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector2ld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector2d);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector2f);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector2i);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector2cf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector2cd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector2cld);
-    
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector3ld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector3d);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector3f);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector3i);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector3cf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector3cd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector3cld);
-    
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector4ld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector4d);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector4f);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector4i);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector4cf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector4cd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(Vector4cld);
+    exposeMatrixInt();
+    exposeMatrixLong();
+    exposeMatrixFloat();
+    exposeMatrixDouble();
+    exposeMatrixLongDouble();
     
-    ENABLE_SPECIFIC_MATRIX_TYPE(VectorXld);
-    ENABLE_SPECIFIC_MATRIX_TYPE(VectorXd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(VectorXf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(VectorXi);
-    ENABLE_SPECIFIC_MATRIX_TYPE(VectorXcf);
-    ENABLE_SPECIFIC_MATRIX_TYPE(VectorXcd);
-    ENABLE_SPECIFIC_MATRIX_TYPE(VectorXcld);
+    exposeMatrixComplexFloat();
+    exposeMatrixComplexDouble();
+    exposeMatrixComplexLongDouble();
   }
 
 } // namespace eigenpy
diff --git a/src/matrix-complex-double.cpp b/src/matrix-complex-double.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..899f88fcc7ba53faf94f577fcd5c02844ef74e79
--- /dev/null
+++ b/src/matrix-complex-double.cpp
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 INRIA
+ */
+
+#include "eigenpy/eigenpy.hpp"
+
+namespace eigenpy
+{
+  void exposeMatrixComplexDouble()
+  {
+    exposeType<std::complex<double> >();
+  }
+}
diff --git a/src/matrix-complex-float.cpp b/src/matrix-complex-float.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..323c52d761d71c4427e610f40f3679409ad87343
--- /dev/null
+++ b/src/matrix-complex-float.cpp
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 INRIA
+ */
+
+#include "eigenpy/eigenpy.hpp"
+
+namespace eigenpy
+{
+  void exposeMatrixComplexFloat()
+  {
+    exposeType<std::complex<float> >();
+  }
+}
diff --git a/src/matrix-complex-long-double.cpp b/src/matrix-complex-long-double.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1f987ae10ef913941d9a34d70362f7f11ae41779
--- /dev/null
+++ b/src/matrix-complex-long-double.cpp
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 INRIA
+ */
+
+#include "eigenpy/eigenpy.hpp"
+
+namespace eigenpy
+{
+  void exposeMatrixComplexLongDouble()
+  {
+    exposeType<std::complex<long double> >();
+  }
+}
diff --git a/src/matrix-double.cpp b/src/matrix-double.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..dc84a9c257af26261b39093872dda7c4acb70a30
--- /dev/null
+++ b/src/matrix-double.cpp
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 INRIA
+ */
+
+#include "eigenpy/eigenpy.hpp"
+
+namespace eigenpy
+{
+  void exposeMatrixDouble()
+  {
+    exposeType<double>();
+  }
+}
diff --git a/src/matrix-float.cpp b/src/matrix-float.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..100b8e9ee77799a0d0cb8e4484abced47a5e3f78
--- /dev/null
+++ b/src/matrix-float.cpp
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 INRIA
+ */
+
+#include "eigenpy/eigenpy.hpp"
+
+namespace eigenpy
+{
+  void exposeMatrixFloat()
+  {
+    exposeType<float>();
+  }
+}
diff --git a/src/matrix-int.cpp b/src/matrix-int.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a4b0d8b2f8f1803350330df7558ca7e764032e5c
--- /dev/null
+++ b/src/matrix-int.cpp
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 INRIA
+ */
+
+#include "eigenpy/eigenpy.hpp"
+
+namespace eigenpy
+{
+  void exposeMatrixInt()
+  {
+    exposeType<int>();
+  }
+}
diff --git a/src/matrix-long-double.cpp b/src/matrix-long-double.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1b2a8f71eed54fa5620ff446e8b000f29a7499ce
--- /dev/null
+++ b/src/matrix-long-double.cpp
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 INRIA
+ */
+
+#include "eigenpy/eigenpy.hpp"
+
+namespace eigenpy
+{
+  void exposeMatrixLongDouble()
+  {
+    exposeType<long double>();
+  }
+}
diff --git a/src/matrix-long.cpp b/src/matrix-long.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..835b6cce0c227305b4a0e203cedfed5f04a56a9e
--- /dev/null
+++ b/src/matrix-long.cpp
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2020 INRIA
+ */
+
+#include "eigenpy/eigenpy.hpp"
+
+namespace eigenpy
+{
+  void exposeMatrixLong()
+  {
+    exposeType<long>();
+  }
+}