Index: branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/StaticCache.cs
===================================================================
--- branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/StaticCache.cs	(revision 13401)
+++ branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/StaticCache.cs	(revision 13407)
@@ -22,9 +22,9 @@
 using System;
 using System.Collections.Generic;
+using System.Drawing;
 using System.Linq;
-using HeuristicLab.PluginInfrastructure;
 using Google.ProtocolBuffers;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Drawing;
+using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Persistence {
@@ -68,6 +68,5 @@
       RegisterType(new Guid("E84C326A-7E14-4F28-AEFF-BC16CC671655"), typeof(KeyValuePair<,>));
       RegisterType(new Guid("F0280B55-25E8-4981-B309-D675D081402A"), typeof(string));
-      // Enum?
-      RegisterType(new Guid("859B7E34-3A07-41A3-AE93-79DCE5A1DB2C"), typeof(Type));
+
       RegisterType(new Guid("D15AD28B-203A-460E-815C-F7230C4B1F75"), typeof(bool[]));
       RegisterType(new Guid("EE318DC4-580D-4DB1-9AAD-988B0E50A3DB"), typeof(byte[]));
Index: branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Transformers/Transformers.cs
===================================================================
--- branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Transformers/Transformers.cs	(revision 13401)
+++ branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Transformers/Transformers.cs	(revision 13407)
@@ -20,9 +20,9 @@
 #endregion
 
-using Google.ProtocolBuffers;
 using System;
 using System.Collections.Generic;
 using System.Drawing;
 using System.Linq;
+using Google.ProtocolBuffers;
 
 namespace HeuristicLab.Persistence {
@@ -383,13 +383,24 @@
   #region Enum
   [Transformer("93FF076B-BC4B-4C39-8C40-15E004468C98", 218)]
-  internal sealed class EnumTransformer : UnsignedIntBoxTransformer<object> {
+  internal sealed class EnumTransformer : Transformer {
     public override bool CanTransformType(Type type) {
       return typeof(Enum).IsAssignableFrom(type);
     }
-    protected override uint ToBoxType(object value, Mapper mapper) {
-      return mapper.GetStringId(Enum.Format(value.GetType(), value, "G"));
-    }
-    protected override object ToValueType(uint value, Type type, Mapper mapper) {
-      return Enum.Parse(type, mapper.GetString(value));
+
+    public override Box ToBox(object o, Mapper mapper) {
+      var boxBuilder = Box.CreateBuilder();
+      var enumBuilder = new UnsignedIntBox.Builder();
+
+      boxBuilder.TransformerId = mapper.GetTransformerId(this);
+      boxBuilder.TypeId = mapper.GetStringId(o.GetType().AssemblyQualifiedName);
+      enumBuilder.Value = mapper.GetStringId(Enum.Format(o.GetType(), o, "G"));
+
+      boxBuilder.SetExtension(UnsignedIntBox.UnsignedInt, enumBuilder.Build());
+      return boxBuilder.Build();
+    }
+
+    public override object ToObject(Box box, Mapper mapper) {
+      uint value = box.GetExtension(UnsignedIntBox.UnsignedInt).Value;
+      return Enum.Parse(Type.GetType(mapper.GetString(box.TypeId)), mapper.GetString(value));
     }
   }
@@ -398,10 +409,20 @@
   #region Type
   [Transformer("8D17FD28-383B-44E9-9BBF-B19D351C5E38", 219)]
-  internal sealed class TypeTransformer : UnsignedIntBoxTransformer<Type> {
+  internal sealed class TypeTransformer : Transformer {
     public override bool CanTransformType(Type type) {
       return typeof(Type).IsAssignableFrom(type);
     }
-    protected override uint ToBoxType(Type value, Mapper mapper) { return mapper.GetTypeId(value); }
-    protected override Type ToValueType(uint value, Type type, Mapper mapper) { return mapper.GetType(value); }
+    public override Box ToBox(object o, Mapper mapper) {
+      var boxBuilder = Box.CreateBuilder();
+
+      boxBuilder.TransformerId = mapper.GetTransformerId(this);
+      boxBuilder.TypeId = mapper.GetStringId(((Type)o).AssemblyQualifiedName);
+
+      return boxBuilder.Build();
+    }
+
+    public override object ToObject(Box box, Mapper mapper) {
+      return Type.GetType(mapper.GetString(box.TypeId));
+    }
   }
   #endregion
Index: branches/PersistenceOverhaul/HeuristicLab.Tests/HeuristicLab.Persistence-3.3/UseCasesPersistenceNew.cs
===================================================================
--- branches/PersistenceOverhaul/HeuristicLab.Tests/HeuristicLab.Persistence-3.3/UseCasesPersistenceNew.cs	(revision 13401)
+++ branches/PersistenceOverhaul/HeuristicLab.Tests/HeuristicLab.Persistence-3.3/UseCasesPersistenceNew.cs	(revision 13407)
@@ -154,5 +154,5 @@
   }
 
-  public enum TestEnum { va1, va2, va3, va8 } ;
+  public enum TestEnum { va1, va2, va3, va8 };
 
   [StorableClass("26BA37F6-926D-4665-A10A-1F39E1CF6468")]
@@ -314,4 +314,42 @@
       Assert.AreEqual(test, result);
     }
+
+    [TestMethod]
+    [TestCategory("Persistence")]
+    [TestProperty("Time", "short")]
+    public void TestEnumSimple() {
+      SimpleEnum se = SimpleEnum.two;
+      ComplexEnum ce = ComplexEnum.three;
+      ProtoBufSerializer serializer = new ProtoBufSerializer();
+      serializer.Serialize(se, tempFile);
+      object o = serializer.Deserialize(tempFile);
+      SimpleEnum result = (SimpleEnum)o;
+      Assert.AreEqual(se, result);
+    }
+
+    [TestMethod]
+    [TestCategory("Persistence")]
+    [TestProperty("Time", "short")]
+    public void TestEnumComplex() {
+      ComplexEnum ce = ComplexEnum.three;
+      ProtoBufSerializer serializer = new ProtoBufSerializer();
+      serializer.Serialize(ce, tempFile);
+      object o = serializer.Deserialize(tempFile);
+      ComplexEnum result = (ComplexEnum)o;
+      Assert.AreEqual(ce, result);
+    }
+
+    [TestMethod]
+    [TestCategory("Persistence")]
+    [TestProperty("Time", "short")]
+    public void TestType() {
+      Type test = typeof(HeuristicLab.Algorithms.GeneticAlgorithm.GeneticAlgorithm);
+      ProtoBufSerializer serializer = new ProtoBufSerializer();
+      serializer.Serialize(test, tempFile);
+      object o = serializer.Deserialize(tempFile);
+      Type result = (Type)o;
+      Assert.AreEqual(test, result);
+    }
+
     #endregion
 
