Why does runtime type checking not work with singleton type?

Say I instantiate an HList so (compiles correctly:

    val ff1b: ICons["5", 5, IEmpT] = ICons("5", 5, IEmpT)
    summon[ff1b.type <:< ICons["5", 5,IEmpT]]

If I use the following run-time checks:

    assert(ff1b.isInstanceOf[ICons[String, Int, IEmpT]])
    assert(ff1b.isInstanceOf[ICons["5", 5, IEmpT]])

I get the error:

[warn] 619 |    assert(ff1b.isInstanceOf[ICons[String, Int, IEmpT]])
[warn]     |           ^^^^
[warn]     |the type test for icollection.IMap.ICons[String, Int, icollection.IMap.IEmpT] cannot be checked at runtime because its type arguments can't be determined from icollection.IMap.ICons[("5" : String), (5 : Int), icollection.IMap.IEmpT]
[warn]     |---------------------------------------------------------------------------
[warn]     | Explanation (enabled by `-explain`)
[warn]     |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[warn]     | Type arguments and type refinements are erased during compile time, thus it's
[warn]     | impossible to check them at run-time.
[warn]     |
[warn]     | You can either replace the type arguments by _ or use `@unchecked`.
[warn]      ---------------------------------------------------------------------------

It seems the normal types can be checked during run-time. Does the above error mean that the singleton types cannot be widened to the standard types or is their more to it?

Also, why is it that type erasure does not occur in this case? I am using type parameters just like in the List[T] case, and there I also cannot do run-time type checking due to erasure.

TIA