diff --git a/py/mpconfig.h b/py/mpconfig.h
index e8c8fcc596d5c109e080e694ffcc2ac6cf70bd0e..b235d6fe66a914573ed90a2052e073255b9d80ee 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -536,6 +536,14 @@ typedef double mp_float_t;
 /*****************************************************************************/
 /* Miscellaneous settings                                                    */
 
+// All uPy objects in ROM must be aligned on at least a 4 byte boundary
+// so that the small-int/qstr/pointer distinction can be made.  For machines
+// that don't do this (eg 16-bit CPU), define the following macro to something
+// like __attribute__((aligned(4))).
+#ifndef MICROPY_OBJ_BASE_ALIGNMENT
+#define MICROPY_OBJ_BASE_ALIGNMENT
+#endif
+
 // On embedded platforms, these will typically enable/disable irqs.
 #ifndef MICROPY_BEGIN_ATOMIC_SECTION
 #define MICROPY_BEGIN_ATOMIC_SECTION() (0)
diff --git a/py/obj.h b/py/obj.h
index 1b1f82414014a51993826f5986efd7699c78974b..0f6179630cf255bd76ad4b7b6a94e89e9ce9a466 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -46,7 +46,7 @@ typedef machine_const_ptr_t mp_const_obj_t;
 
 struct _mp_obj_type_t;
 struct _mp_obj_base_t {
-    const struct _mp_obj_type_t *type;
+    const struct _mp_obj_type_t *type MICROPY_OBJ_BASE_ALIGNMENT;
 };
 typedef struct _mp_obj_base_t mp_obj_base_t;