Value type is AnyObject! Why?

This is correct (albeit unintuitive at first) behaviour, and is a result of id-as-Any. See the following thread for more info:

Regarding your example with the array:

let array: [AnyObject] = []

if array is [Int] {
    print("// yes [AnyObject] is [Int]")
}

it's worth noting that currently empty arrays can be cast to any array type. For example:

let array: [String] = []

if array is [Int] {
  print("yup")
}
// prints: yup

There's some discussion of this behaviour in the comments of SR-6192.