Index: libcfa/src/Makefile.am
===================================================================
--- libcfa/src/Makefile.am	(revision d414664b3fcda8f61f1064c2243cd6933479112c)
+++ libcfa/src/Makefile.am	(revision 72713e5bd3cf1fe33bcf6d53d418f97ac9ed6c2c)
@@ -85,4 +85,5 @@
 	parseconfig.hfa \
 	rational.hfa \
+	enum.hfa \
 	stdlib.hfa \
 	strstream.hfa \
Index: libcfa/src/enum.hfa
===================================================================
--- libcfa/src/enum.hfa	(revision 72713e5bd3cf1fe33bcf6d53d418f97ac9ed6c2c)
+++ libcfa/src/enum.hfa	(revision 72713e5bd3cf1fe33bcf6d53d418f97ac9ed6c2c)
@@ -0,0 +1,30 @@
+#pragma once
+
+forall(E) trait Bounded {
+    E lowerBound();
+    E upperBound();
+};
+
+forall(E | Bounded(E)) trait Serial {
+    unsigned fromInstance(E e);
+    E fromInt(unsigned i);
+    E succ(E e);
+    E pred(E e);
+};
+
+forall(E, T) trait TypedEnum {
+    T valueE(E e);
+    char * labelE(E e);
+    unsigned int posE(E e);
+};
+
+forall(E, T| TypedEnum(E, T)) {
+    // comparison
+    int ?==?(E l, E r);
+    int ?!=?(E l, E r);
+    int ?!=?(E l, zero_t);
+    int ?<?(E l, E r);
+    int ?<=?(E l, E r);
+    int ?>?(E l, E r);
+    int ?>=?(E l, E r);
+}
