Playing around with exceptions I got really tired of walking up the type tree using .getType().BaseType.GetType().fullname so I decided to create a simple Resolve-Type function. The functions output is not very well formatted, I may improve on this later.

function Resolve-Type
{
	param(
	[Parameter(ParameterSetName="Type",Position=0)]
	[String]
	$TypeName,

	[Parameter(ParameterSetName="Object",Position=0,ValueFromPipeline=$true)]
	[Object]
	$InputObject
	)
	process {
		switch ($PsCmdlet.ParameterSetName)
	    {
	    "Type"  {
			if ($TypeName -as [Type])
			{
				 $TypeInfo = [Type]$TypeName
			}
			else
			{
				Write-Error 'The specified type is not correct. Make sure the assembly is loaded.'
			}

			}
	    "Object"  { $TypeInfo = $inputObject.GetType() }
	    } 

		Function ResolveCore ([System.Reflection.TypeInfo]$TypeInfo)
		{
			$TypeInfo.fullname
			if ( $TypeInfo.BaseType)
			{
				$base = $TypeInfo.BaseType.asType()
				ResolveCore $base
			}
		}	

		#call the recursive function
		ResolveCore -TypeInfo $TypeInfo
	}
}
Resolve-Type -TypeName IO.File
Example 1:
System.IO.File
System.Object

Example 2:
System.Management.Automation.Internal.Host.InternalHost
System.Management.Automation.Host.PSHost
System.Object

Example 3:
System.Management.Automation.ItemNotFoundException
System.Management.Automation.SessionStateException
System.Management.Automation.RuntimeException
System.SystemException
System.Exception
System.Object

Example 4:
System.String
System.Object