For a list that will change, text + check constraint. Changing the list is one migration that drops and re-adds the constraint. With an enum, adding is easy (alter type ... add value) but removing or renaming a value is painful.
alter table orders add constraint orders_status_check
check (status in ('pending','paid','shipped','cancelled','refunded'));supabase gen types turns enums into a nice union type, while a check becomes plain string. That's the one thing you give up.