diff --git a/extmod/moductypes.c b/extmod/moductypes.c
index 6293d91af3c75ed03c0d6342239ca083a7106c44..6e4a94b606762d35d8ae194d8da11fe94bf2a1b6 100644
--- a/extmod/moductypes.c
+++ b/extmod/moductypes.c
@@ -512,8 +512,8 @@ STATIC mp_obj_t uctypes_struct_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_ob
     if (value == MP_OBJ_NULL) {
         // delete
         return MP_OBJ_NULL; // op not supported
-    } else if (value == MP_OBJ_SENTINEL) {
-        // load
+    } else {
+        // load / store
         if (!MP_OBJ_IS_TYPE(self->desc, &mp_type_tuple)) {
             nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "struct: cannot index"));
         }
@@ -533,9 +533,24 @@ STATIC mp_obj_t uctypes_struct_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_ob
             }
 
             if (t->len == 2) {
-                byte *p = self->addr + GET_SCALAR_SIZE(val_type) * index;
-                return get_unaligned(val_type, p, self->flags);
-            } else {
+                // array of scalars
+                if (self->flags == LAYOUT_NATIVE) {
+                    if (value == MP_OBJ_SENTINEL) {
+                        return get_aligned(val_type, self->addr, index);
+                    } else {
+                        set_aligned(val_type, self->addr, index, value);
+                        return value; // just !MP_OBJ_NULL
+                    }
+                } else {
+                    byte *p = self->addr + GET_SCALAR_SIZE(val_type) * index;
+                    if (value == MP_OBJ_SENTINEL) {
+                        return get_unaligned(val_type, p, self->flags);
+                    } else {
+                        set_unaligned(val_type, p, self->flags, value);
+                        return value; // just !MP_OBJ_NULL
+                    }
+                }
+            } else if (value == MP_OBJ_SENTINEL) {
                 mp_uint_t dummy = 0;
                 mp_uint_t size = uctypes_struct_size(t->items[2], self->flags, &dummy);
                 mp_obj_uctypes_struct_t *o = m_new_obj(mp_obj_uctypes_struct_t);
@@ -544,7 +559,10 @@ STATIC mp_obj_t uctypes_struct_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_ob
                 o->addr = self->addr + size * index;
                 o->flags = self->flags;
                 return MP_OBJ_FROM_PTR(o);
+            } else {
+                return MP_OBJ_NULL; // op not supported
             }
+
         } else if (agg_type == PTR) {
             byte *p = *(void**)self->addr;
             if (MP_OBJ_IS_SMALL_INT(t->items[1])) {
@@ -564,9 +582,6 @@ STATIC mp_obj_t uctypes_struct_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_ob
 
         assert(0);
         return MP_OBJ_NULL;
-    } else {
-        // store
-        return MP_OBJ_NULL; // op not supported
     }
 }