diff --git a/Framework/PythonInterface/mantid/api/src/Exports/ITableWorkspace.cpp b/Framework/PythonInterface/mantid/api/src/Exports/ITableWorkspace.cpp
index 99108d3813d9b43bd8ddf16e715ce13bbfbfa7eb..b88671b0c277cec4cea21714f44ee0e850ae431a 100644
--- a/Framework/PythonInterface/mantid/api/src/Exports/ITableWorkspace.cpp
+++ b/Framework/PythonInterface/mantid/api/src/Exports/ITableWorkspace.cpp
@@ -303,20 +303,18 @@ PyObject *row(ITableWorkspace &self, int row) {
  * @param self A reference to the TableWorkspace python object that we were
  * called on
  */
-PyObject *columnTypes(ITableWorkspace &self) {
+boost::python::list columnTypes(ITableWorkspace &self) {
   int numCols = static_cast<int>(self.columnCount());
 
-  PyObject *list = PyList_New(numCols);
+  boost::python::list types;
 
   for (int col = 0; col < numCols; col++) {
-    Mantid::API::Column_const_sptr column = self.getColumn(col);
-    const std::type_info &typeID = column->get_type_info();
-    if (PyList_SetItem(list, col, FROM_CSTRING(typeID.name()))) {
-      throw std::runtime_error("Error while building list");
-    }
+    const auto column = self.getColumn(col);
+    const auto &type = column->type();
+    types.append(type);
   }
 
-  return list;
+  return types;
 }
 
 /**
diff --git a/Framework/PythonInterface/test/python/mantid/api/ITableWorkspaceTest.py b/Framework/PythonInterface/test/python/mantid/api/ITableWorkspaceTest.py
index ea1baf299d492dd8e3164b7652dc55d5da16c7da..2d9fe0a81c3dc98253d52dc2b25425e0e159c05b 100644
--- a/Framework/PythonInterface/test/python/mantid/api/ITableWorkspaceTest.py
+++ b/Framework/PythonInterface/test/python/mantid/api/ITableWorkspaceTest.py
@@ -211,12 +211,25 @@ class ITableWorkspaceTest(unittest.TestCase):
         table.addRow([3, 4])
         self.assertEquals(table.rowCount(), 2)
 
+    def test_column_types(self):
+        table = WorkspaceFactory.createTable()
+        table.addColumn(type="int",name="index")
+        table.addColumn(type="str",name="value")
+        table.addColumn(type="V3D",name="position")
+
+        types = table.columnTypes()
+
+        self.assertEqual(types[0], "int")
+        self.assertEqual(types[1], "str")
+        self.assertEqual(types[2], "V3D")
+
+
     def test_convert_to_dict(self):
         from mantid.kernel import V3D
         expected_output = {
-            'index': [1, 2], 
-            'value': ['10', '100'], 
-            'position': [V3D(0, 0, 1), V3D(1, 0, 0)] 
+            'index': [1, 2],
+            'value': ['10', '100'],
+            'position': [V3D(0, 0, 1), V3D(1, 0, 0)]
         }
 
         table = WorkspaceFactory.createTable()
diff --git a/docs/source/release/v3.14.0/framework.rst b/docs/source/release/v3.14.0/framework.rst
index 30bde215b78d1ce1baee87195f0a0086fe62094c..b597b5e32f022edd4bb8f04831a077a0076caa06 100644
--- a/docs/source/release/v3.14.0/framework.rst
+++ b/docs/source/release/v3.14.0/framework.rst
@@ -145,6 +145,7 @@ Improvements
 - :ref:`ChudleyElliot <func-ChudleyElliot>` includes hbar in the definition
 - :ref:`Functions <FitFunctionsInPython>` may now have their constraint penalties for fitting set in python using ``function.setConstraintPenaltyFactor("parameterName", double)``.
 - :py:obj:`mantid.kernel.Logger` now handles unicode in python2
+- :py:meth:`mantid.api.ITableWorkspace.columnTypes` now returns human readable strings for non-primitive column types.
 
 
 Bugfixes