Index: tests/exceptions/.expect/type-check.txt
===================================================================
--- tests/exceptions/.expect/type-check.txt	(revision 8f9104301dac64ff5114b917d62f3da005252937)
+++ tests/exceptions/.expect/type-check.txt	(revision 75f8e04b89821fbf689fe24c6319e2a8170cb5e1)
@@ -1,4 +1,4 @@
-exceptions/type-check.cfa:8:1 error: catch must have pointer to an exception type
-exceptions/type-check.cfa:9:1 error: catch must have pointer to an exception type
-exceptions/type-check.cfa:10:1 error: catchResume must have pointer to an exception type
-exceptions/type-check.cfa:11:1 error: catchResume must have pointer to an exception type
+exceptions/type-check.cfa:6:1 error: catch must have pointer to an exception type
+exceptions/type-check.cfa:7:1 error: catch must have pointer to an exception type
+exceptions/type-check.cfa:8:1 error: catchResume must have pointer to an exception type
+exceptions/type-check.cfa:9:1 error: catchResume must have pointer to an exception type
Index: tests/exceptions/cancel/coroutine.cfa
===================================================================
--- tests/exceptions/cancel/coroutine.cfa	(revision 8f9104301dac64ff5114b917d62f3da005252937)
+++ tests/exceptions/cancel/coroutine.cfa	(revision 75f8e04b89821fbf689fe24c6319e2a8170cb5e1)
@@ -2,8 +2,7 @@
 
 #include <coroutine.hfa>
-#include <exception.hfa>
 
-EHM_EXCEPTION(internal_error)();
-EHM_VIRTUAL_TABLE(internal_error, internal_vt);
+exception internal_error {};
+vtable(internal_error) internal_vt;
 
 coroutine WillCancel {};
Index: tests/exceptions/cancel/thread.cfa
===================================================================
--- tests/exceptions/cancel/thread.cfa	(revision 8f9104301dac64ff5114b917d62f3da005252937)
+++ tests/exceptions/cancel/thread.cfa	(revision 75f8e04b89821fbf689fe24c6319e2a8170cb5e1)
@@ -2,8 +2,7 @@
 
 #include <thread.hfa>
-#include <exception.hfa>
 
-EHM_EXCEPTION(internal_error)();
-EHM_VIRTUAL_TABLE(internal_error, internal_vt);
+exception internal_error {};
+vtable(internal_error) internal_vt;
 
 thread WillCancel {};
Index: tests/exceptions/conditional.cfa
===================================================================
--- tests/exceptions/conditional.cfa	(revision 8f9104301dac64ff5114b917d62f3da005252937)
+++ tests/exceptions/conditional.cfa	(revision 75f8e04b89821fbf689fe24c6319e2a8170cb5e1)
@@ -4,11 +4,9 @@
 // up the non-trivial exception is reasonable to do.
 
-#include <exception.hfa>
+exception num_error {
+	int num;
+};
 
-EHM_EXCEPTION(num_error)(
-	int num;
-);
-
-EHM_VIRTUAL_TABLE(num_error, num_error_vt);
+vtable(num_error) num_error_vt;
 
 void caught_num_error(int expect, num_error * actual) {
Index: tests/exceptions/data-except.cfa
===================================================================
--- tests/exceptions/data-except.cfa	(revision 8f9104301dac64ff5114b917d62f3da005252937)
+++ tests/exceptions/data-except.cfa	(revision 75f8e04b89821fbf689fe24c6319e2a8170cb5e1)
@@ -1,12 +1,10 @@
 // Test exceptions that add data but no functionality.
 
-#include <exception.hfa>
-
-EHM_EXCEPTION(paired)(
+exception paired {
 	int first;
 	int second;
-);
+};
 
-EHM_VIRTUAL_TABLE(paired, paired_vt);
+vtable(paired) paired_vt;
 
 const char * virtual_msg(paired * this) {
Index: tests/exceptions/defaults.cfa
===================================================================
--- tests/exceptions/defaults.cfa	(revision 8f9104301dac64ff5114b917d62f3da005252937)
+++ tests/exceptions/defaults.cfa	(revision 75f8e04b89821fbf689fe24c6319e2a8170cb5e1)
@@ -4,7 +4,7 @@
 #include <exception.hfa>
 
-EHM_EXCEPTION(log_message)(
+exception log_message {
 	char * msg;
-);
+};
 
 _EHM_DEFINE_COPY(log_message, )
@@ -32,10 +32,10 @@
 
 // I don't have a good use case for doing the same with termination.
-EHM_EXCEPTION(jump)();
+exception jump {};
 void defaultTerminationHandler(jump &) {
 	printf("jump default handler.\n");
 }
 
-EHM_VIRTUAL_TABLE(jump, jump_vt);
+vtable(jump) jump_vt;
 
 void jump_test(void) {
@@ -48,9 +48,9 @@
 }
 
-EHM_EXCEPTION(first)();
-EHM_VIRTUAL_TABLE(first, first_vt);
+exception first {};
+vtable(first) first_vt;
 
-EHM_EXCEPTION(unhandled_exception)();
-EHM_VIRTUAL_TABLE(unhandled_exception, unhandled_vt);
+exception unhandled_exception {};
+vtable(unhandled_exception) unhandled_vt;
 
 void unhandled_test(void) {
@@ -69,6 +69,6 @@
 }
 
-EHM_EXCEPTION(second)();
-EHM_VIRTUAL_TABLE(second, second_vt);
+exception second {};
+vtable(second) second_vt;
 
 void cross_test(void) {
Index: tests/exceptions/finally.cfa
===================================================================
--- tests/exceptions/finally.cfa	(revision 8f9104301dac64ff5114b917d62f3da005252937)
+++ tests/exceptions/finally.cfa	(revision 75f8e04b89821fbf689fe24c6319e2a8170cb5e1)
@@ -1,10 +1,9 @@
 // Finally Clause Tests
 
-#include <exception.hfa>
 #include "except-io.hfa"
 
-EHM_EXCEPTION(myth)();
+exception myth {};
 
-EHM_VIRTUAL_TABLE(myth, myth_vt);
+vtable(myth) myth_vt;
 
 int main(int argc, char * argv[]) {
Index: tests/exceptions/interact.cfa
===================================================================
--- tests/exceptions/interact.cfa	(revision 8f9104301dac64ff5114b917d62f3da005252937)
+++ tests/exceptions/interact.cfa	(revision 75f8e04b89821fbf689fe24c6319e2a8170cb5e1)
@@ -1,12 +1,11 @@
 // Testing Interactions Between Termination and Resumption
 
-#include <exception.hfa>
 #include "except-io.hfa"
 
-EHM_EXCEPTION(star)();
-EHM_EXCEPTION(moon)();
+exception star {};
+exception moon {};
 
-EHM_VIRTUAL_TABLE(star, star_vt);
-EHM_VIRTUAL_TABLE(moon, moon_vt);
+vtable(star) star_vt;
+vtable(moon) moon_vt;
 
 int main(int argc, char * argv[]) {
Index: tests/exceptions/polymorphic.cfa
===================================================================
--- tests/exceptions/polymorphic.cfa	(revision 8f9104301dac64ff5114b917d62f3da005252937)
+++ tests/exceptions/polymorphic.cfa	(revision 75f8e04b89821fbf689fe24c6319e2a8170cb5e1)
@@ -1,10 +1,8 @@
 // Testing polymophic exception types.
 
-#include <exception.hfa>
+forall(T &) exception proxy {};
 
-EHM_FORALL_EXCEPTION(proxy, (T&), (T))();
-
-EHM_FORALL_VIRTUAL_TABLE(proxy, (int), proxy_int);
-EHM_FORALL_VIRTUAL_TABLE(proxy, (char), proxy_char);
+vtable(proxy(int)) proxy_int;
+vtable(proxy(char)) proxy_char;
 
 void proxy_test(void) {
@@ -33,11 +31,11 @@
 }
 
-EHM_FORALL_EXCEPTION(cell, (T), (T))(
+forall(T) exception cell {
 	T data;
-);
+};
 
-EHM_FORALL_VIRTUAL_TABLE(cell, (int), int_cell);
-EHM_FORALL_VIRTUAL_TABLE(cell, (char), char_cell);
-EHM_FORALL_VIRTUAL_TABLE(cell, (bool), bool_cell);
+vtable(cell(int)) int_cell;
+vtable(cell(char)) char_cell;
+vtable(cell(bool)) bool_cell;
 
 void cell_test(void) {
Index: tests/exceptions/resume.cfa
===================================================================
--- tests/exceptions/resume.cfa	(revision 8f9104301dac64ff5114b917d62f3da005252937)
+++ tests/exceptions/resume.cfa	(revision 75f8e04b89821fbf689fe24c6319e2a8170cb5e1)
@@ -1,14 +1,13 @@
 // Resumption Exception Tests
 
-#include <exception.hfa>
 #include "except-io.hfa"
 
-EHM_EXCEPTION(yin)();
-EHM_EXCEPTION(yang)();
-EHM_EXCEPTION(zen)();
+exception yin {};
+exception yang {};
+exception zen {};
 
-EHM_VIRTUAL_TABLE(yin, yin_vt);
-EHM_VIRTUAL_TABLE(yang, yang_vt);
-EHM_VIRTUAL_TABLE(zen, zen_vt);
+vtable(yin) yin_vt;
+vtable(yang) yang_vt;
+vtable(zen) zen_vt;
 
 void in_void(void);
Index: tests/exceptions/terminate.cfa
===================================================================
--- tests/exceptions/terminate.cfa	(revision 8f9104301dac64ff5114b917d62f3da005252937)
+++ tests/exceptions/terminate.cfa	(revision 75f8e04b89821fbf689fe24c6319e2a8170cb5e1)
@@ -1,14 +1,13 @@
 // Termination Exception Tests
 
-#include <exception.hfa>
 #include "except-io.hfa"
 
-EHM_EXCEPTION(yin)();
-EHM_EXCEPTION(yang)();
-EHM_EXCEPTION(zen)();
+exception yin {};
+exception yang {};
+exception zen {};
 
-EHM_VIRTUAL_TABLE(yin, yin_vt);
-EHM_VIRTUAL_TABLE(yang, yang_vt);
-EHM_VIRTUAL_TABLE(zen, zen_vt);
+vtable(yin) yin_vt;
+vtable(yang) yang_vt;
+vtable(zen) zen_vt;
 
 void in_void(void);
Index: tests/exceptions/trash.cfa
===================================================================
--- tests/exceptions/trash.cfa	(revision 8f9104301dac64ff5114b917d62f3da005252937)
+++ tests/exceptions/trash.cfa	(revision 75f8e04b89821fbf689fe24c6319e2a8170cb5e1)
@@ -1,11 +1,9 @@
 // Make sure throw-catch during unwind does not trash internal data.
 
-#include <exception.hfa>
+exception yin {};
+exception yang {};
 
-EHM_EXCEPTION(yin)();
-EHM_EXCEPTION(yang)();
-
-EHM_VIRTUAL_TABLE(yin, yin_vt);
-EHM_VIRTUAL_TABLE(yang, yang_vt);
+vtable(yin) yin_vt;
+vtable(yang) yang_vt;
 
 int main(int argc, char * argv[]) {
Index: tests/exceptions/type-check.cfa
===================================================================
--- tests/exceptions/type-check.cfa	(revision 8f9104301dac64ff5114b917d62f3da005252937)
+++ tests/exceptions/type-check.cfa	(revision 75f8e04b89821fbf689fe24c6319e2a8170cb5e1)
@@ -1,7 +1,5 @@
 // Check that the exception type check works.
 
-#include <exception.hfa>
-
-EHM_EXCEPTION(truth)();
+exception truth {};
 
 int main(int argc, char * argv[]) {
