Class to hold data for a fund
I'm not really a VB.Net'er but you appear to be able to achieve what you're after using the Widening Operator.  It allows you to make your value property a Friend so that it can only be accessed from within your module.  However, it's not ideal, as you have to create the widening operator in your FundDetail class and any inheritted classes.  Depending on the number of different field types you may end up with more typing.  I found that I had to change the isValid method to Overridable, rather than Shared in order to get it to be called on derived classes, but that might be because of my lack of VB.Net experience.  It also works by creating new instances of objects so there is some overhead.  An example of what it looks like is below:

Public Class FundElement
    Public Name As New FundDetail
    Public Price As New FundDetail
    Public Code As New CodeDetail
End Class

Public Class FundDetail

    Protected _value As String

    Friend Property value As String
        Get
            Return _value
        End Get

        Set(valueToAssign As String)
            If isValid(valueToAssign) Then
                _value = valueToAssign
            Else
                Throw New ArgumentException
            End If
        End Set
    End Property

    Overridable Function isValid(detail As String) As Boolean
        Return True
    End Function

    Public Shared Widening Operator CType(ByVal val As String) As FundDetail
        Dim retVal As New FundDetail
        retVal.value = val
        Return retVal
    End Operator
    '
    Public Shared Widening Operator CType(ByVal val As FundDetail) As String
        Return val.value
    End Operator
End Class

Public Class CodeDetail
    Inherits FundDetail

    Public Overrides Function isValid(value As String) As Boolean
        Dim intPattern As Regex = New Regex("[a-zA-Z]{3}[0-9]{12}")
        Return intPattern.IsMatch(value)
    End Function

    Public Shared Shadows Widening Operator CType(ByVal val As String) As CodeDetail
        Dim retVal As New CodeDetail
        retVal.value = val
        Return retVal
    End Operator

    Public Shared Shadows Widening Operator CType(ByVal val As CodeDetail) As String
        Return val.value
    End Operator

End Class


And Usage:

    Dim fe As New FundElement
    fe.Name = "Google Inc"
    fe.Code = "USD451234151234"

    Dim val As New String(fe.Name)


    Console.WriteLine("{0}:{1}", CStr(fe.Name), CStr(fe.Code))


You'll notice from the usage example that whilst it can be used for String targets directly, it also doesn't default cast the object to a string when passed to something that expects an unknown / object such as the WriteLine call.  So there are some definite downsides to this approach, it's whether or not the benefits are sufficient for your case.

Bug?

As I've said, I rarely write VB.  However, this feels like a bug to me:

Shared Function isValid(detail As String) As Boolean
Shared Shadows Function isValid(value As String) As Boolean


You're using shared functions to determine if the strings are valid.  So, if you do this:

CodeDetail.isValid("USD45123415~~~~~~~~~~1234")


The shadowing works, and the correct implementation is invoked.  However, because you're invoking the implementation from the base class:

If isValid(valueToAssign) Then


Then as the base class only knows about the isValid it's implemented, it's invoking that version, not the newer version on the child.  As I've said in the comments, if I do this:

fe.Code.value = "USD45123415~~~~~~~~~~1234"


No error is thrown, however if I do this:

If CodeDetail.isValid("USD45123415~~~~~~~~~~1234") Then


Then I know the error should be thrown.

If you want it to behave the way you're expecting, you need to use Overridable functions (as in my example) so that dynamic dispatch from the base class works.