@mvuets за помощь!) Кстати, оказалось, что Mojo::Json из чисел делает строки :-/
Решил добавить проверку на тип значения в распарсенном JSON (число или строка). Test::Deep::num и str тип зачем-то меняют. Выяснилось, что можно проверять по наличию флагов IOK, NOK и POK у скаляра. В итоге написал две реализации: чистый XS и с использованием B::Flags. Накалякал 52 теста, вроде работает. Не покидает чувство, что изобрел велосипед. (Спасибо