Nimrod support these rather directly:
type
Day = range[1..31]
Month = range[1..12]
WeekDay = enum
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
WorkingDays = range[Monday..Friday]
WorkingHours = range[0..12]
WorkSchedule = array[WorkingDays, WorkingHours]
Errors are enforced either at compile-time:
var x: Day
x = 40 # conversion from int literal(40) to Day is invalid
.. or at run-time
var x: Day
var y = unknownInt() # let's say it returns 100
x = y # unhandled exception: value 100 out of range [EOutOfRange]
Furthermore, distinct types can be used if even stronger type safety is required.