PowerShell is dynamically typed, so it should just work, right?"
Wrong. The output goes
System.Xml.XmlDocument System.Xml.XmlDocument Cannot convert value "23" to type "System.Xml.XmlDocument". Error: "Data at the root level is invalid. Line 1, position 1." At line:5 char:3 + $y <<<< = 23 + CategoryInfo : MetadataError: (:) , ArgumentTransformationMetadataException + FullyQualifiedErrorId : RuntimeException
So you can make static typed values, but can't even tell by inspecting the object whether it's static type or not. Combine this with the loose scoping that makes separate scopes nigh impossible (unless you want to write a proper closure, when it doesn't work), this makes little local scratch variables a lurking menace in any non-trivial script.
If only more people would get with the program and use F# as their .net scripting language.