Nice question, thanks!
Though I think the explanation left a little to be desired. It isn't just that the decimal type was used, it was that the decimal type was used and no precision/scale was specified, so the number got rounded down to 1.0 when it was converted.
For example this results in the same thing as all of your float examples:
select Ceiling(convert(decimal(2, 1), 1.09))
Because with a scale of one specified it gets rounded to 1.1 before it goes to ceiling.