Index: libcfa/src/enum.cfa
===================================================================
--- libcfa/src/enum.cfa	(revision 236f13390c74aff36386095c9fc9fff394243822)
+++ libcfa/src/enum.cfa	(revision 0c327cee778443a440104253db33557cee4d2a92)
@@ -5,4 +5,35 @@
 
 #pragma GCC visibility push(default)
+
+forall( E | Serial( E ) ) {
+    E fromInt( unsigned i ) {
+        E upper = upperBound();
+        E lower = lowerBound();
+        // It is okay to overflow as overflow will be theoretically caught by the other bound
+        assert( i <= fromInstance(upper) && i >= fromInstance(lower) 
+            &&  "Not a valid value");
+        return fromInt_unsafe( i );
+    }
+
+    E succ( E e ) {
+        E upper = upperBound();
+        assert( (fromInstance(e) < fromInstance(upper)) 
+            && "Calling succ() on the last" );
+        return succ_unsafe(e);
+    }
+
+    E pred( E e ) {
+        E lower = lowerBound();
+        assert( (fromInstance(e) > fromInstance(lower)) 
+            && "Calling pred() on the first" );
+        return pred_unsafe(e);
+    }
+
+    int Countof( __attribute__((unused)) E e ) {
+        E upper = upperBound();
+        E lower = lowerBound();
+		return fromInstance( upper ) + fromInstance( lower ) + 1;
+    }
+}
 
 int scmp( const void * str1, const void * str2 ) {
Index: libcfa/src/enum.hfa
===================================================================
--- libcfa/src/enum.hfa	(revision 236f13390c74aff36386095c9fc9fff394243822)
+++ libcfa/src/enum.hfa	(revision 0c327cee778443a440104253db33557cee4d2a92)
@@ -1,4 +1,5 @@
 #pragma once
 
+#include <assert.h>
 #include "iostream.hfa"
 
@@ -10,8 +11,27 @@
 forall( E | Bounded( E ) ) trait Serial {
     unsigned fromInstance( E e );
+    E fromInt_unsafe( unsigned i );
+    E succ_unsafe( E e );
+    E pred_unsafe( E e );
+};
+
+forall( E | Serial( E ) ) {
     E fromInt( unsigned i );
     E succ( E e );
     E pred( E e );
-};
+    int Countof( E e );
+}
+
+// forall( E | Bounded(E) ) trait SafeSerial {
+//     // unsigned fromInstance( E e );
+//     E fromInt_unsafe( unsigned i );
+//     // E succ_unsafe( E e );
+//     //E pred_unsafe( E e );
+
+//     unsigned fromInstance( E e );
+//     E fromInt( unsigned i );
+//     E succ( E e );
+//     E pred( E e );
+// };
 
 forall( E | Serial( E ) ) trait CfaEnum {
@@ -33,19 +53,4 @@
 	OSTYPE_VOID( E );
 }
-
-// forall( ostype & | ostream( ostype ), E | CfaEnum( E, quasi_void ) ) {
-// 	ostype & ?|?( ostype &, E );
-// 	OSTYPE_VOID( E );
-// }
-
-// Design two <- should go for this if we have change the cost model
-// forall( E | Serial( E ) ) trait CfaEnum {
-//     char * label( E e );
-//     unsigned int posn( E e );
-// };
-
-// forall( E, V| CfaEnum( E)) trait TypedEnum {
-//     V value( E e);
-// };
 
 static inline
