The type BYTE is compatible with the type INTEGER, and vice-versa.
Интересная формулировка. Т.е., различие только в размере. При этом можно писать как "int := byte" так и "byte := int". Ну и как тут не вспомнить Arian-5?
Если так подумать, то подобное непроверяемое и не безопасное присваивание не новость в Обероне.
Скажем в 07/11 всегда можно было char := CHR(100500); -- это вполне может дать непредсказуемый результат. Ну и INCL/EXCL тоже могли положить свинью, если учесть что INTEGER, в отличае от SET'a гвоздями к 32битам не прибит. То есть в нем могут быть значения которые не отображаются на SET.
Ну, кроме того BYTE тут беззнаковый, то есть модулярный тип, а для него переход через границы вполне нормальное, разрешенное действие даже в Аде (в отличие от знакового INTEGER'a, который может легко переполниться при умножении скажем).
Так что я тут не вижу особой проблемы.