I've only successfully used it on tables of object types (a collection, not an index=by table). The type must be defined previously in the database (i.e. create type <whatever> as table of <object type>). Any instances of these types declared and used in the PL/SQL block can be CAST into tables.
I have been trying to use object types as much as possible because it seems to me that Oracle is nudging us in that direction. That is, the newer cooler stuff that they add (like CAST and TABLE operators) only work on the collection data types and then only work well if the collection is of an object type.