Index: libcfa/src/enum.cfa
===================================================================
--- libcfa/src/enum.cfa	(revision 2dd5c6dbeb7bce0ee526e30911002092ab2769d8)
+++ libcfa/src/enum.cfa	(revision 5f210c08ab78098d82c19b6a8bfa3d0be728f733)
@@ -6,5 +6,5 @@
 
 forall( E | Serial( E ) ) {
-	E fromInt( unsigned i ) {
+	E fromInt( int i ) {
 		E upper = upperBound();
 		E lower = lowerBound();
Index: libcfa/src/enum.hfa
===================================================================
--- libcfa/src/enum.hfa	(revision 2dd5c6dbeb7bce0ee526e30911002092ab2769d8)
+++ libcfa/src/enum.hfa	(revision 5f210c08ab78098d82c19b6a8bfa3d0be728f733)
@@ -9,6 +9,6 @@
 
 forall( E | Bounded( E ) ) trait Serial {
-	unsigned fromInstance( E e );
-	E fromInt_unsafe( unsigned i );
+	int fromInstance( E e );
+	E fromInt_unsafe( int i );
 	E succ_unsafe( E e );
 	E pred_unsafe( E e );
@@ -16,5 +16,5 @@
 
 forall( E | Serial( E ) ) {
-	E fromInt( unsigned i );
+	E fromInt( int i );
 	E succ( E e );
 	E pred( E e );
@@ -36,5 +36,5 @@
 forall( E ) trait CfaEnum {
 	const char * label( E e );
-	unsigned int posn( E e );
+	int posn( E e );
 };
 
@@ -63,43 +63,49 @@
 
 	E ++?( E & l ) { 									// increment operators
-		l = succ( l );
+		int pos = posn(l);
+		l = fromInt_unsafe(pos+1);
+		return l;
+	}
+
+	E --?( E & l ) {
+		int pos = posn(l);
+		l = fromInt_unsafe(pos-1);
 		return l;
 	}
 
 	E ?+=? ( E & l, one_t ) {
-		l = succ(l);
+		int pos = posn(l);
+		l = fromInt_unsafe(pos+1);
 		return l;
 	}
-	
+
 	E ?-=? ( E & l, one_t ) {
-		l = pred(l);
+		int pos = posn(l);
+		l = fromInt_unsafe(pos-1);
 		return l;
 	}
 
 	E ?+=? ( E & l, int i ) {
-		int pos = posn(l) + i;
+		int pos = posn(l);
+		l = fromInt_unsafe(pos+i);
 		return fromInt(pos);
 	}
 
 	E ?-=? ( E & l, int i ) {
-		int pos = posn(l) - i;
-		return fromInt(pos);
-	}
-	
-	E ?++( E & l ) {
-		E ret = l;
-		l = succ( l );
-		return ret;
-	}
-
-	E --?( E & l ) {
-		l = pred( l );
+		int pos = posn(l);
+		l = fromInt_unsafe(pos-i);
 		return l;
 	}
 
+	E ?++( E & l ) {
+		int pos = posn(l);
+		l = fromInt_unsafe(pos+1);
+		return fromInt_unsafe(pos);
+	}
+
 	E ?--( E & l ) {
-		E ret = l;
-		l = pred( l );
-		return ret;
+		int pos = posn(l);
+		l = fromInt_unsafe(pos-1);
+		return fromInt_unsafe(pos);
 	}
 }
